Forum: Compiler & IDEs anfängerproblem - datenlogger und uart


von avrbeginner (Gast)


Lesenswert?

Hallo zusammen.

ich beschäftige mich erst seit kurzem mit avr und bin deshalb noch 
anfänger.
seit tagen beschäftige ich mich mit einem problem, und komme nicht 
dahinter.

ich möchte einen datenlogger realisieren und habe dazu den release von 
daniel r.

http://www.mikrocontroller.net/articles/AVR_FAT32

das ganze funktioniert auch recht gut. ich lese datum uhrzeit und vier 
adc kanäle ein und schreibe diese werte in eine .csv-datei auf die 
karte.

jetzt wollte ich noch ein kleines menü dazu machen welches über uart 
ausgegeben wird. Das menü wird in einem unterprogramm ausgeführt, aber 
nur wenn ein taster gedrück wird.

das problem ist, auch wenn der taster nicht gedrück wird, und somit das 
unterprogramm nicht ausgeführt wird, sendet der uart trotzdem die 
strings aus dem unterprogramm und den eigentlichen datenstring, was in 
summe natürlich kryptische zeichen ergibt.

mir ist unklar, wie so etwas zustande kommt, da ja das unterprogramm gar 
nicht ausgeführt wird, wenn der taster nicht gedrück wird.

infos und wesentlicher code:
atmega32, 16mhz, fuses: high is 0xD9, low is 0xFF (jtag deaktiviert)

die uart init erfolgt in der main, danach der aufruf für das 
unterprogramm:
1
  uinit();
2
  
3
  if(!(PIND & (1<<PIND6))) 
4
     {
5
      _delay_ms(50);
6
      uartmenu();
7
8
    
9
     }
in der while-schleife erfolgt dann der aufruf für die schreibroutine
1
send();

es folgt das unterprogramm uartmenu
1
  if(!(PIND & (1<<PIND6))) // switchpin is high
2
    {
3
4
       _delay_ms(50);
5
      
6
  uputs("\n\r**************************************************");
7
  uputs("\n\r      sd and microsd datalogger");
8
  uputs("\n\r**************************************************");
9
      
10
      uputs("\n\r> 1 : Display current Date/Time");
11
      uputs("\n\r> 2 : Update Date");
12
      uputs("\n\r> 3 : Update Time");
13
      uputs("\n\r> 4 : Get Filelist");
14
      uputs("\n\r> 5 : Exit Menu");
15
      
16
      uputs("\n\r\n\r Enter the option");
17
                  //geht noch weiter
18
            }
es folgt das unterprogramm send
1
void send(void)
2
//zuerst wird der datenstring gebildet
3
{
4
  // lfn oder sfn
5
  #if (MMC_LFN_SUPPORT == TRUE)
6
    uint8_t file_name [] = "test_file.csv";
7
  #else
8
    uint8_t file_name [] = "test.csv";
9
  #endif
10
  
11
  // string zum auf die karte schreiben.
12
  #if (MMC_WRITE == TRUE)
13
    
14
       
15
  uint8_t str = dataString; //funktioniert!
16
    
17
  #endif 
18
19
  uint32_t seek;  
20
    
21
    
22
    
23
  uputs((uint8_t*)"\nBoot\n\n");
24
  uputs((uint8_t*)dataString);  
25
      
26
27
  
28
  if( FALSE == mmc_init() ){
29
    uputs((uint8_t*)"\n\rinit failed!");
30
    return;
31
  } 
32
33
  uputs((uint8_t*)"...");
34
      
35
36
  
37
  if( FALSE == fat_loadFatData() ){
38
        uputs((uint8_t*)"\n\rcan't load FatData!");
39
        return;
40
  }
41
42
  // wenn auf dem terminal "Boot...OK" zu lesen ist, war initialisierung erfolgreich!
43
  uputs((uint8_t*)"OK\n");
44
45
  #if (MMC_WRITE ==TRUE)  // create and append only if write is TRUE
46
    // ****************************************************
47
  
48
  // if file exists, it will be opened and then append to it.
49
  if( MMC_FILE_OPENED == ffopen(file_name,'r') ){
50
  PORTD |= (1<<PIND7);//flash while write      
51
      ffseek(file.length);
52
         ffwrites(str);        
53
      ffwrite(0x0D);    // new line in file
54
         ffwrite(0x0A);
55
      ffclose();
56
      PORTD &= ~(1<<PIND7);//led off
57
    }
58
  
59
  
60
  // ***************************************************  
61
  
62
// if the file does not exist, it will be created and written to it.
63
    if(MMC_FILE_CREATED == ffopen(file_name,'c') ){
64
      PORTD |= (1<<PIND7);//flash while write
65
      ffwrites(str);        
66
      ffwrite(0x0D);    // new line in file
67
         ffwrite(0x0A);
68
      ffclose();
69
      PORTD &= ~(1<<PIND7);//led off
70
    }   
71
  #endif 
72
  
73
  
74
// ***************************************************
75
  // read file complete and print via uart!
76
  if( MMC_FILE_OPENED == ffopen(file_name,'r') ){
77
    PORTD |= (1<<PIND7);//flash while write      
78
    seek = file.length;
79
    do{
80
       uputc( ffread() );            
81
    }while(--seek);
82
    ffclose();
83
    PORTD &= ~(1<<PIND7);//led off
84
  }
85
  
86
  
87
  
88
}
es folgt die uart init
1
void uinit (void){  //init usart Tx, 8n1 ,UDRE interupt enable
2
  
3
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);  // Asynchron 8N1
4
  UBRRH = (uint8_t)(UBRR_VAL>>8);
5
  UBRRL = (uint8_t)UBRR_VAL;
6
  UCSRB |= (1<<TXEN)|(1<<RXEN);    // UART TX,RX einschalten,  
7
}

sobald ich die sendeeinträge aus uartmenu auskommentiere läuft das 
programm und schreib mir brav die messwerte in die .csv

für hilfe wäre ich sehr dankbar!

: Bearbeitet durch User
von avrbeginner (Gast)


Lesenswert?

ok, ich habs nach langen tests hinbekommen.
die ausgabestrings lasse ich alle über progmem ausgeben.
funktioniert so recht gut.

grüße
avrbeginner

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.