Forum: Mikrocontroller und Digitale Elektronik AVR Studio Zahlenschloss Programm Problem


von Florian (Gast)


Lesenswert?

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
von Floh (Gast)


Lesenswert?

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.
:-)

von Floh (Gast)


Lesenswert?

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.
:-)

von Florian (Gast)


Lesenswert?

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 =(

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Was wird hier programmiert? Ein AVR. Ist das ein PC? Nein -> verschoben

von Florian (Gast)


Lesenswert?

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? ^^

von Floh (Gast)


Lesenswert?

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 :-)

von Floh (Gast)


Lesenswert?

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
:-)

von gasd12 (Gast)


Lesenswert?

kann es sein das die geschweiften klammern nicht zu sind? 7 gehen auf 
aber nur 6 gehen zu oder hab ich mich verzählt?

von Florian (Gast)


Angehängte Dateien:

Lesenswert?

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 ;)

von Floh (Gast)


Lesenswert?

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
:-)

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

Florian schrieb:

> so fehler war wirklich ne geschweifte klammer, allerdings läuft es nicht
> richtig...

Kannst du 'nicht richtig' etwas konkreter formulieren?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Florian (Gast)


Lesenswert?

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 =)

von Florian (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.