mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR Studio Zahlenschloss Programm Problem


Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 Moderator
Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
:-)

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
:-)

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 =(

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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? ^^

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
int code =0;
//Wenn du auf eine int-Variable die erste Eingabe speicherst
//als z.B. mit switch, oder einfach direkt
code = code + PIND;

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

//das ganze viermal entweder durch Hinschreiben oder in einer Schleife 

//später kann man dann ganz bequem abfragen
if(code == 1990)
{
 //mach was
}
Hoffe das war verständlich :-)

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
:-)

Autor: gasd12 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Florian (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
:-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Florian schrieb:

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

Kannst du 'nicht richtig' etwas konkreter formulieren?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 =)

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 
=)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.