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;
}
}
}
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
intcode=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
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
:-)
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
=)