[C] Simpele printf output in I/O Window

Pagina: 1
Acties:

  • Cassius
  • Registratie: Januari 2002
  • Niet online
Beste medetweakers,

Zet aub je 'beginners'-bril op, want dat is wat ik ben. Ik ken C net twee weekjes en programmeer in MPLAB IDE v7.50 :) . De microcontroller is een USB PIC18F4550 met als codeloader de PICDEM FS USB Tool.

Afijn, allemaal mooi en aardig. Ik heb de microcontroller eerst binair laten optellen door de 10bits ADC te vertalen naar een rij van 10 LEDs. De sensor simuleerde ik met behulp van een 10K potmeter.

Vraag 1: op de een of andere manier ging dit meteen goed, terwijl ik geen range specificeerde! Hij telde helemaal tot de max en netjes via de binaire volgorde. Is dit omdat hij automatisch 5V spanningsverschil als 10bits resolutie pakt?

Anyway, de programmeervraag. Ik heb de volgende code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#define Blue PORTBbits.RB0
#define White PORTCbits.RC0

void main(void)                             //Start programma
{   
    int ResultX;
    int ResultY;

    TRISA = 0x0f;                           //Port A input
    TRISB = 0x00;                           //Port B output
    TRISC = 0x00;                           //Port C output

    ADCON1 = 0x07;                          //Portconfig: AN0 analog, other i/o digital, Vref- = Vss, Vref+ = Vdd
    ADCON2 = 0b00111010;                    //Result left justified, aq time = 20 Tad, conversion clock = Fosc/32

    while(1)
    {
        ADCON0 = 0x01;                      //Channel 0 (A0), not started, ADC ON
        Delay10TCYx(5);                     //Delay for 50TCY
        ADCON0bits.GO = 1;                  //Start conversion
        while(ADCON0bits.GO == 1);          //Wait for completion
        ResultX = ADRESH;                   //Read result, 8 MSBs

        if(ResultX > 74){
            Blue = 1;
        }
        else{Blue = 0;}

        printf("ResultX equals %d \n", ResultX);    

        ADCON0 = 0x05;                      //Channel 1 (A1), not started, ADC ON
        Delay10TCYx(5);                     //Delay for 50TCY
        ADCON0bits.GO = 1;                  //Start conversion
        while(ADCON0bits.GO == 1);          //Wait for completion
        ResultY = ADRESH;                   //Read result, 8 MSBs

        if(ResultY > 84){
            White = 1;
        }
        else{White = 0;}

        printf("ResultY equals %d \n", ResultY);
    }
}


Dat build en werkt prima en als ik de acceleratiesensor beweeg gaan de LEDs (A en B) bij de verschillende assen netjes even aan.

Nu wil ik gewoon die waarde zien in een soort van I/O Window? Een watch window op die variabele, maar dat bied deze software niet. Ik had het wel met de IAR Launcher en C-SPY (maar die PIC kende ik heel slecht). Kan iemand een paar gouden tips geven?

De meeste mensen deugen!


  • Invisible_man
  • Registratie: Juni 2006
  • Laatst online: 10:42
Je kan wel printen naar de comm-poort (als je die hebt iig op deze pic), dan kan je, als je die aan je pc hangt, met hyperterminal of elk ander terminal programma zo zien wat er allemaal gestuurd wordt.

  • Cassius
  • Registratie: Januari 2002
  • Niet online
Op de PIC zelf heb ik geen COM poort, hij beschikt over vier blokken met 6 aansluitingen (simpelweg pinnetjes) en die kan ik hoog of laag maken. Maar kan de PIC dan niet de ADC resultaten uitlezen na de conversie en lief terugsturen over de USB ... dat ik vervolgens met een bepaald I/O of Watch Window uit kan lezen :/ ?

Zo is die printf functie voor mij namelijk -compleet- nutteloos :/ . Moet ik misschien een scanf gebruiken om iets eerst in te lezen of is dat met deze code niet noodzakelijk?

[ Voor 21% gewijzigd door Cassius op 08-03-2007 12:18 ]

De meeste mensen deugen!


  • Invisible_man
  • Registratie: Juni 2006
  • Laatst online: 10:42
Met printf en scanf denk je wat te veel in C voor windows en niet in C voor microcontrollers. Als ik mij goed herinner aan de paar keer dat ik met mplab gewerkt heb (vind het zelf niet een prettig programma) zat daar wel de functie in om variabelen uit te lezen. Hiervoor gebruik ik overigens een ICD (in circuit debugger) waarmee ik ook de uC programeer. Deze ICD biedt een aantal opties om registers uit te lezen uit de uC en stap voor stap je programma door te lopen (aka debuggen).

In hoevere je data over kan pompen via USB weet ik zo ook niet, maar het lijkt mij dat dat op een soortgelijke manier als via RS232 gaat.

Edit: Overigens heeft hij vier blokken met 6 poorten, maar met 8 (= 1 Byte)

[ Voor 5% gewijzigd door Invisible_man op 08-03-2007 12:30 ]


  • Cassius
  • Registratie: Januari 2002
  • Niet online
Ik bedenk me net dat op het moment dat ik het programma in de PIC run, dat de USB verbinding wordt verbroken ... het enige wat ik me kan bedenken is dat hij die waarden dan in een soort van geheugen array dumpt (2D het liefst) die ik dan later weer kan uitlezen als de USB verbinding weer intact is en het programma niet runt.

Misschien kan ik dan in dat register snuffelen? Hoe kom ik erachter of mijn PIC een ICD heeft :X ? Even speuren!

De meeste mensen deugen!


  • Invisible_man
  • Registratie: Juni 2006
  • Laatst online: 10:42
Je PIC heeft niet een ICD, een ICD is een los apparaatje om een PIC mee te programeren en debuggen. Zoek maar eens op op de microchip site.

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 30-11 00:17
Cassius schreef op donderdag 08 maart 2007 @ 12:07:
Vraag 1: op de een of andere manier ging dit meteen goed, terwijl ik geen range specificeerde! Hij telde helemaal tot de max en netjes via de binaire volgorde. Is dit omdat hij automatisch 5V spanningsverschil als 10bits resolutie pakt?
Ligt eraan of je een aparte REF/AREF hebt of dattie automatisch Vcd van de proc pakt, ken de PIC niet zo goed.

Verder, om debug messages te kunnen sturen moet je idd een COM poort oid hebben. Misschien dat je lib een debug msg functie hebben of zoiets? Als je em via USB aansluit heb je kans dat je via die poort iets kan doen. ( Die pinnen zijn vaak wel geshared dwz dat je ze ook als in of output pins kunt gebruiken )

hmmm als ik deze link http://ww1.microchip.com/downloads/en/AppNotes/00956b.pdf bekijk heb je een API om prut via USB te doen. Kijk er eens naar.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1