Hallo, ich bastel gerade an meinem ersten Board mit dem AtMega8 und habe mir ein Zahlenschloss zur hand genommen. Board ist fertig, Programm nicht - da gibts probleme... erstmal zur Funktion selbst: Es gibt 2 Leds, Rot und Grün. Rot an PORTC 0x02; grün an PORTC 0x01; dann ein Relais an 0x04. als "Tastatur" habe ich erstmal einen BCD-Dekodierschalter genommen, welcher mit einem druck auf einen Taster an PINC 0x08 bestätigt wird. Die Rote LED soll leuchten, wenn ein falscher Code eingegeben wurde, die Grüne wenn der richtige eingegeben wurde. Ganz simpel also ^^ Problem am Programm: gcc plug-in: Error: Object file not found on expected location C:....\Zahlenschloss.elf ich poste mal mein Programm vielleicht findet ihr den fehler. #include <avr/io.h> #include <util/delay.h> #define TAKT 1000000UL int main(void) { DDRD=0x00; DDRC=0b00000111; int i=0; int x; char code; while(1) { while (i<4) { if(PINC==0x08) { _delay_ms(100) x=PIND; switch(x) { case 0x00: code = code + '0'; break; case 0x01: code = code + '1'; break; case 0x02: code = code + '2'; break; case 0x03: code = code + '3'; break; case 0x04: code = code + '4'; break; case 0x05: code = code + '5'; break; case 0x06: code = code + '6'; break; case 0x07: code = code + '7'; break; case 0x10: code = code + '8'; break; case 0x11: code = code + '9'; break; } if (PINC==0x00) i++; } if (code=='1990') { PORTC=0x05; _delay_ms(3000); PORTC=0x00; i=0; } else { PORTC=0x02; _delay_ms(3000); i=0; } } }
:
Verschoben durch User
Florian schrieb: > char code; > case 0x00: code = code + '0'; > if (code=='1990') Das funktioniert so nicht! Ein char kann nur genau 1 (in Worten "ein") Zeichen speichern. Daher arbeite lieber mit einer Ganzzahlvariable. :-)
Apropos, nur zum Klarstellen: Das > gcc plug-in: Error: Object file not found on expected location > C:....\Zahlenschloss.elf ist sicher nicht die ganze Fehlermeldung. Der gcc sagt, er kann die Datei nicht finden. Klar kann er sie nicht finden, da der Compiler einen Syntaxfehler erkannt hat und so die Datei garnicht erschaffen hat. Daher -> Compilermeldungen beachten. :-)
habe es jetzt so gemacht: int code[4]; case 0x11: code[i] =9; if ((code[0]==1)&&(code[1]==9)&&(code[2]==9)&&(code[3]==0)) hatte außerdem 1 ";" vergessen, funzt aber immernoch nicht =(
naja compiler sagt erst: acr-gcc.exe -mmcu=atmega8 -Wall -gdwarf-2 -00 -MD -MP -MT Zahlenschloss.o -MF dep/Zahlenschloss.o.d -c ../Zahlenschloss.c In Datei, eingefügt con ../Zahlenschloss.c:2: C:/WinAVR/avr/include/util/delay.h:136:3: Warnung: #warning "F_CPU not defined for <util/delay.h>" ../Zahlenschloss.c: In function 'main': ../Zahlenschloss.c:60: Fehler: Syntaxfehler am Ende der Eingabe make: *** [Zahlenschloss.o] Error 1 Build succeeded with 0 Warnings... so und was heißt das alles? ^^
Florian schrieb: > hatte außerdem 1 ";" vergessen, funzt aber immernoch nicht =( Das Compilieren oder das Programm? Übrigends, grad eben hattest du nur eine Variable, die den Code nicht komplett speichern konnte, jetzt benutzt du 4 Variablen, von denen jede den kompletten Code speichern kann. Schau her:
1 | int code =0; |
2 | //Wenn du auf eine int-Variable die erste Eingabe speicherst
|
3 | //als z.B. mit switch, oder einfach direkt
|
4 | code = code + PIND; |
5 | |
6 | //für die nächste stelle können wir das auch machen, wir müssen nur
|
7 | //die erste Zahl nach links "verschieben":
|
8 | code = code * 10; |
9 | code = code + PIND; |
10 | |
11 | //das ganze viermal entweder durch Hinschreiben oder in einer Schleife
|
12 | |
13 | //später kann man dann ganz bequem abfragen
|
14 | if(code == 1990) |
15 | {
|
16 | //mach was
|
17 | }
|
Hoffe das war verständlich :-)
Florian schrieb: > ../Zahlenschloss.c:60: Fehler: Syntaxfehler am Ende der Eingabe Schmeiß doch bitte mal dein Programm dann als Anhang hier rein, dann wissen wir auch wo Zeile 60 ist, in der oder einer vorher ist ein Syntaxfehler :-)
kann es sein das die geschweiften klammern nicht zu sind? 7 gehen auf aber nur 6 gehen zu oder hab ich mich verzählt?
Floh schrieb: > //für die nächste stelle können wir das auch machen, wir müssen nur > //die erste Zahl nach links "verschieben": > code = code * 10; > code = code + PIND; die idee hatte ich auch schon nur ist das nicht etwas aufwändig?? er muss ja erst wissen bei welcher zahl er ist und dann noch das mal 10,100 und 1000... ich dachte meine 2. idee wäre dann einfacher ^^ so fehler war wirklich ne geschweifte klammer, allerdings läuft es nicht richtig... könnt es euch ja mal ansehen, hab die .c datei angehängt ;)
Florian schrieb: > so fehler war wirklich ne geschweifte klammer, allerdings läuft es nicht > richtig... könnt es euch ja mal ansehen, hab die .c datei angehängt ;) Lass mich raten, dein Bestätigungstaster ist auf PINC 3 ? Das Problem ist, dass du Wahrscheinlich 20 Auslösungen pro Taster bekommst, Stichwort Prellen von Tastern. Daher solltest du deinen Taster entprellen. http://www.mikrocontroller.net/articles/Entprellung :-)
Florian schrieb: > Floh schrieb: >> //für die nächste stelle können wir das auch machen, wir müssen nur >> //die erste Zahl nach links "verschieben": >> code = code * 10; >> code = code + PIND; > > die idee hatte ich auch schon nur ist das nicht etwas aufwändig?? Im Grunde ja. Aber wie schnell kann dein Benutzer eingeben? Dein µC kann mit Sicherheit schneller rechnen als dein Benutzer auch nur die nächste Einstellung optisch fixieren kann.
Florian schrieb: > so fehler war wirklich ne geschweifte klammer, allerdings läuft es nicht > richtig... Kannst du 'nicht richtig' etwas konkreter formulieren?
Hängt an deinem Port C noch irgendetwas anderes? Das hier if(PINC==0x08) das löst Bauchkrämpfe aus. Ich lass mal die fehlende Entprellung beiseite, da du mit dem nachfolgenden _delay etwas ähnlich bekommst. Aber: Da muss am Port C alles stimmen, damit dann exakt 0x08 rauskommt! Tu das nicht. Du willst wissen, ob 1 Bit gesetzt ist. Dann frag auch nur dieses 1 Bit ab! if( PINC & 0x08 ) jetzt bist du alle anderen Bits von diesem Port los. Die Abfrage spricht nur noch auf dieses 1 Bit an, und auf nichts anderes. Alle anderen Bits können an diesem Port sein wie sie wollen, sie beeinflussen die Abfrage nicht mehr.
Karl heinz Buchegger schrieb: >Hängt an deinem Port C noch irgendetwas anderes? ja die LEDS und das Relais... > if( PINC & 0x08 ) > > jetzt bist du alle anderen Bits von diesem Port los. Die Abfrage spricht > nur noch auf dieses 1 Bit an, und auf nichts anderes. Alle anderen Bits > können an diesem Port sein wie sie wollen, sie beeinflussen die Abfrage > nicht mehr. > > > das wusste ich noch nicht das dies so geht danke =) werde ich ausprobieren ;) >Kannst du 'nicht richtig' etwas konkreter formulieren? gebe den code ein, springt auch bis zu den 2. if wo dann das relais ansprechen soll wenn der richtige code eingegeben wurde, springt allerdings zum else und somit geht das Relais nicht an... ich versuche mal den tipp von oben =)
ah es läuft =) hab nicht beachtet, das der PORTD 0x08 nicht läuft, hab ihn aber trotzdem mitbenutzt ichbindoofdenk ^^ warum er nicht läuft: hab den versehentlich aufm board geschrottet :D naja bedanke mich trotzdem bei allen die mir tipps gegeben haben und wünsche euch allen ein frohes fest und einen guten rutsch ins neue Jahr =)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.