anfängerproblem - datenlogger und uart

Gast #4019614
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!

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.