Forum: Compiler & IDEs STK500 Testprog funzt in C funzt nicht?


von littlecb (Gast)


Angehängte Dateien:

Lesenswert?

Hallo ich hab ein komisches Problem, vielleicht könnt ihr helfen.

habe mir ein STK500 zugelegt und gleich mal mit GCC das Testprogramm,
welches im User Guide in Assembler geschrieen steht in C geschrieben und 
im AVR-Studio simuliert. dann die HEX-Datei in den ATMega16 geschrieben. 
Aber nix tut sich ... absolut nichts. Ich finde einfach nicht den 
Fehler.

Also wie schon gesagt ich verwende einen ATmega16 mit internen 
RC-Oszillator
mit 1MHz.

zur Kontrolle hatte ich das Orginal-Programm-Hexfile von Atmel 
reingeschrieben und alles funzte auf anhieb.

Könnt ihr mir helfen?!

von Uhu U. (uhu)


Lesenswert?

Poste mal das ASM-Programm - vielleicht macht die Portierung nach C was 
anderes, als dein C-Programm.

von littlecb (Gast)


Lesenswert?

Welches ASM brauchst du jetzt von mir?

das, das ich in C übersetzt habe, oder ...

die Übersetzung meines Compilers?

von littlecb (Gast)


Angehängte Dateien:

Lesenswert?

Also hier hab ich erstmal die Übersetzung von GCC zu meinem C Programm.

das Orginal ASM Programm liefer ich noch nach. Sollte aber im Netz zu 
finden sein.

von littlecb (Gast)


Angehängte Dateien:

Lesenswert?

So hier das Orginaltestprog vom STK500 in ASM.

wäre echt supi wenn von euch jemand den Fehler entdeckt.
Ist halt auch sehr eigenartig, weil die Simulation astrein funktioniert.
Nur nicht im ATMEGA.

best regards
littlecb

von Johannes M. (johnny-m)


Lesenswert?

Du musst anstelle von KEYPORT natürlich KEYPIN einlesen. Sonst 
funktioniert gar nichts.

Eine andere Sache ist, dass das C-Programm etwas anderes macht als das 
Assembler-Programm. Im Assembler-Programm werden die Bits vom Port 
einzeln abgefragt, während das C-Programm den gesamten Port auf einen 
bestimmten Zustand hin abfragt.
1
sbis PIND, 0x00
fragt ab, ob das Bit Nr. 0 im Portregister gesetzt ist, während die 
Zustände aller anderen Bits im Portregister ignoriert werden.
1
if(PINx == 0b11111110){}
allerdings fragt ab, ob das Bit Nr. 0 "0" ist und alle anderen Bits im 
Register "1". Das kann nur funktionieren, wenn immer nur ein Taster 
betätigt wird. Mehrere Taster gleichzeitig gehen schief.
1
if(!(PINx & (1 << 0))){}
macht das, was im Assembler-Code vorgesehen ist. Ansonsten schau bitte 
mal ins AVR-GCC-Tutorial.

von littlecb (Gast)


Lesenswert?

Hallo Johannes,

super Hinweise von Dir. Werd ich heut nach der Arbeit gleich mal 
ausprobieren. Als du das mit den PINx abfragen erklärt hast fiel
mir es wie Schuppen von den Augen.

Also ich meld mich was draus wird.
Danke nochmals.

best regard
littlecb

von littlecb (Gast)


Lesenswert?

Hi Johannes,

hattest den absoluten Volltreffer! g

PIN statt PORT bei Zustandsabfrage ...

geändert => sofort funktioniert! :-D

best THX
Christian

von Johannes M. (johnny-m)


Lesenswert?

littlecb wrote:
> hattest den absoluten Volltreffer! *g*
Ach was... Hattest Du daran gezweifelt? Hinfort mit Dir, Ungläubiger:-!

Ist doch hoffentlich klar, dass es mit PORTx nicht klappen KANN, weil 
sich das Register ohne Eingriff des Programms selbst nicht ändern kann. 
Nur PINx spiegelt wider, was tatsächlich an den Portpins los ist.

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.