mikrocontroller.net

Forum: Compiler & IDEs Probleme mit EEPROM und Tasterentprellung in c ATMega16


Autor: Dirk S. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo alle zusammen,

hab mich jetzt auch mal an die Programmiesprache c gewagt. Allerdings 
bekomme ich das Program nicht fehlerfrei zum laufen.
(Programm ist im Anhang, allerdings alles in einer txt Datei)
Kann ich einen kompletten Ordner in den Dateianhang schieben?

Ich orientiere mich größtenteils an die Tutorials. Ich programmiere 
einen ATMega16 mit dem AVR Studio und übertrage mit PonyProg. Das meiste 
funktioniert, aber bei einigen Sachen bin ich überfragt und weiß nicht, 
wo der Fehler ist.

Mein Programm beinhaltet zur Zeit fünf Dateien. Ich hab einige Probleme 
mit dem EEPROM und der Entprellung. Ich hab meine Fragen bzw. Probleme 
mit an die Programerklärung gekoppelt.

Programmerklärung:

*Eingangsnamen.c:*

ich will, das der ATMega einmal "EING.x + 10      Leerzeichen" = 16 Byte 
ins EEPROM schreibt, wobei x für die zahlen 1 - 8 steht. 16 byte * 8 = 
128 byte im EEPROM (
uint8_t Eingang[8][16] EEMEM = {};
 )

Das soll er aber nur einmal machen, sodass er nicht nach jedem Reset das
EEPROM neu beschreibt. Nach dem ersten Beschreiben
 Anfangsnamen[1] = 1 
 )(auch im EEPROM)   -> somit beschreibt er nur einmal

-> habe ich im AVR Studio getestet und es funktioniert,aber:

1. wenn ich in watch gehe: myByte sagt er Location not valid Warum?

2. wenn ich meine for Schleifen hoch zähle bis zu einem bestimmten Wert, 
zeigt er mir, dass er sie runter zählt (z.b j=4 am Anfang und nicht 0) 
Ist das normal?

3.
 uint8_t Eingang[8][16] EEMEM = {}; 
       uint8_t Anfangsnamen[1] EEMEM ={}; 
 )

Das steht in Eingangsnamen.c, und das selbe in Verteiler.c und LCD.c
nur mit extern davor.
Warum kann man diese nicht ohne extern in Vertiler.c und mit extern in 
Eingangsnamen und in LCD.c schreiben? Ist  das nicht egal? Hauptsache 
ist doch, das ich diese in einer *c. definiert habe. In anderen *c. 
Dateien, die darauf zugreufen wollen, sage ich dem compiler mit dem 
Attribut extern doch bloß, dass diese Array woanders definiert ist.

../Eingangsnamen.c:5: warning: `Eingang' initialized and declared 
`extern'

Das ist jedenfall die Warnung die ich bekomme und dann noch den ERROR, 
das
er die objekt file nicht erstellen kann.

Ich würde es eigentlich gerne  in Verteiler.h schreiben kann, also mit
extern und ohne extern in Verteriler.c. Dann nur noch in jede Datei 
Verteiler.h includen.
Funktioniert aber nicht und ich verstehe nicht warum.

*Entprellung.c:*

"Debouncing 8 Keys" von Peter Dannegger -> ich habe vier Taster
    angeschlossen, die entprellt werden

4. Wenn ich Taster_1 sage, er soll nur was machen, wenn ich kurz drücke,
   dann reagiert dieser aber auch wenn ich lange drücke. Kann doch nicht
   Sinn der Sache sein. Oder?

5. Wie soll das mit dem Repeat funktionieren -> habe ich ausprobiert, 
aber
   der hat nach jedem Tastendruck reagiert. Ich hab dann auch mal die
   Repeat Zeiten verändert, hat aber auch nichts gebracht. Kann mir 
Jemand weiter helfen?

*LCD.c:*

LCD-Routinen aus dem Tutorial und einige, die ich mir selber geschrieben
habe.
u.a.: string_Ausgabe: ich kann der Funtion sagen, wo (Zeile,Spalte) ich 
die Ausgabe auf dem LCD hinhaben möchte und wieviel Zeichen er ausgeben
soll. Außerdem sage ich ihm noch, ob er aus dem EEPROM oder dem SRAM 
lesen soll.

6. Hier funktioniert die Länge des ausgebenen strings und die Position, 
allerdings zeigt er mir immer nur fünf schwarze Kästechen auf dem 
Display.
Hier habe ich auch schon rumprobiert was das Zeug hält. Ich kann auch 
ins
EEPROm schreiben, dann lesen und ausgeben, also mit den Funktionen aus 
eeprom.h. Bloß mit dieser Funktion will er einfach nicht.

Ich hab im AVR Studio durchgetestet und er zeigt mir auch an, dass er 
den
Buchstaben, den ich haben will in der Variable byte hat. Er übergibt 
diese auch an
 )lcd_data()
 ). Bloß wenn ich das Programm übertrage zeigt er mir nur 5 schwarze 
Kästchen an. Ich habe auch keine Idee mehr woran es liegen könnte.

*Uhr.c:*

von Peter Dannegger, allerdings habe ich ein bisschen was 
dazugeschrieben,
sodass ich mir die Stunden, Minuten und Sekunden anzeigen lassen kann
Hier funktioniert alles.

*Verteiler.c:*

enthält die main

und dann gibts zu jeder *.c Datei noch die entsprechende header files 
*.h

7. Frage zu Verteiler.h: Muss ich bei den #define`S alle einzeln mit 
#ifndef und #endif umklammern, sodass ich sie dann nicht ausversehen in 
einer *.c Datei (oder *.o) doppelt drin habe?

Ok, schon mal Danke im vorraus, der schon mal Bock hatte sich den Text 
durchzulesen.

Gruß von Dirk

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.