Forum: Mikrocontroller und Digitale Elektronik Einsteigsproblem: AVR führt Programm nicht aus?


von David (Gast)


Lesenswert?

Hallo!

Ich experimentiere seit ein paar Tagen mit dem AVR STK500 Board und dem 
darauf gesteckten ATMega8515L.

Um die grundlegenden Funktionen zu testen, habe ich die Leds des STK an 
PORTB, die Schalter an PORTA angeschlossen.

Als Entwicklungsumgebung nutze ich die neuesten Versionen von AVR-Studio 
(4.13) und Win-AVR (25. Mai 2007).

Und soweit bin ich jetzt:

Ich habe, weil ein bereits erstelltes komplexeres Programm nicht lief, 
einen einfachen Wenig-Zeiler geschrieben, um die Funktionen zu testen:
1
#include <avr/io.h>
2
3
int main (void)
4
{
5
  DDRB = (1<<DDB7);
6
7
  PORTB = (1<<PORTB7);
8
9
  return 0;
10
}

Das Build funktioniert, der Debugger zeigt korrekte Werte für die 
Register an.

Auch die Verbindung zum STK500 klappt und der Programmiervorgang per ISP 
(inkl. Verify) meldet keinerlei Fehler.

Nur: Keine der Leds leuchtet (Led7 sollte ja eigentlich?)


Was mache ich falsch? Braucht der µC ein Art "Startsignal" um das 
Programm auszuführen?

Ich habs schon mit Flash/EEPROM versucht, funktioniert beides nicht. 
Randfrage: Wo wäre das Programm besser aufgehoben?


Mit C/C++ hab ich schon ne gewisse Erfahrung, mit µC quasi keine.

von Karl H. (kbuchegg)


Lesenswert?

Wenn ich mich richtig erinnere sind die LEDS am STK500
low aktiv. D.h. man muss eine 0 ausgeben um sie zu
Leuchten zu bringen
1
#include <avr/io.h>
2
3
int main (void)
4
{
5
  DDRB = 0xFF;
6
7
  PORTB = 0b10101010;
8
9
  return 0;
10
}

Damit sollten auf jeden Fall 4 von den LED leuchten.

von Johannes M. (johnny-m)


Lesenswert?

1.: Die LEDs am STK500 sind Low-Side (invertiert) angeschlossen, also 
müssten normalerweise alle LEDs bis auf die Nr. 7 leuchten...

2.: Ans Ende eines µC-Programms gehört i.d.R. eine Endlosschleife 
(while(1) oder for(;;)), wobei viele Compiler diese Schleife automatisch 
einfügen. Der Rückgabewert kann dann auch wegfallen.

3.: Das Programm gehört ins Flash und sonst nirgendwo hin. Datenblatt 
und/oder Tutorial lesen!

von David (Gast)


Lesenswert?

@Karl Heinz:

Danke, funktioniert!

Komischerweise hab ich vorher sowas schon probiert, allerdings mit ner 
Hex-Zahl für das PORTB Register. Das ging nicht.

Auch scheint die Pin-weise Ansteuerung des Ports nicht zu funktionieren.

Wenn ich nicht das gesamte DDRB Register auf 1 setze, sprich 0xFF, 
kriege ich keine einzige LED zum Leuchten.

@Johannes:

1. Stimmt, aber bei nem Text mit 0xff und für DDRB und verschiedenen 
PORTB Configs tats irgendwie auch nicht... komisch.

2. Ja, hab ich auch schon drinngehabt, hat nix wirklich geändert, bis 
auf das, dass der Debugger dann an der Zeile PORTB=... stehen geblieben 
ist und nicht mehr weitergelaufen.
Das "return 0;" lass ich drann, weil sonst der Compiler meckert: 
int-Funktion ohne Rückgabewert = böse. :)

3. Ok, danke, irgendwie hab ich das immer überlesen.

von David (Gast)


Lesenswert?

Anmerkung:

Doch, geht auch ohne DDRB=0xFF, Fehler meinerseits.

Mensch bin ich blöd heute...


Danke für eure Hilfe, nochmal!

von Christian Erker (Gast)


Lesenswert?

Auf PortB liegt auch die SPI, daher sind manche Pins nicht ohne 
Einschränkungen nutzbar.

Gruß,
Christian

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.