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
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!