PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : AVR: Ausgaenge invertiert?, Timer?



Minifriese
02.02.2005, 20:33
Moin moin,

Ich experimentiere gerade mit einem ATMega8. Ich will auf PORTC die vier Bits an einen Schrittmotortreiber geben, aber irgendwie spinnt der Port. Wenn ich mein Programm


#include <avr\io.h>
#include <avr\interrupt.h>
#include <avr\signal.h>

#define S0 0x0D
#define S1 0xD0
#define S2 0x07
#define S3 0x70

volatile unsigned char dir=0,s=0; // Volatile, damit die Interrupt-Routine Zugriff hat

SIGNAL(SIG_OVERFLOW0) { // Schritt vorwaerts (mit ca 4Hz)
if(dir==1) {
if(s==0) s=1;
if(s==1) s=2;
if(s==2) s=3;
if(s==3) s=0;
}
if(dir==0) {
if(s==0) s=3;
if(s==1) s=0;
if(s==2) s=1;
if(s==3) s=2;
}
}

int main(void) {
DDRB=0x00;
DDRC=0xFF;
TCCR0=0x05; // Prescaler = Interner Takt / 1024
dir=1; // Motor erstmal nur linksherum drehen
s=0; // In Position 0 anfangen

sei(); // Interrupts einschalten
while(1) {
switch(s) { // Je nach aktueller Position entsprechende Bits setzen
case 0: PORTC=S0; break;
case 1: PORTC=S1; break;
case 2: PORTC=S2; break;
case 3: PORTC=S3; break;
}
}
}

so lade und den Port erstmal an die LEDs auf dem STK500 anschliesse, dann gibt das anscheinend ein Zufallsmuster, bei dem sich aber nichts bewegt.
Ich hab dann mal probeweise PORTC auf 0xFF gesetzt: Alle LEDs gehen aus. PORTC auf 0x00: Alle LEDs gehen an. Ist das nicht genau verkehrtherum? Ich habe nirgendwo gefunden, dass der AVR die Ausgaenge invertiert.

Aber selbst wenn ich das so akzeptiere und meine ausgegebenen Bits entsprechend invertiere, gibt das nix sinnvolles.

Also Fragen an die AVR-Freaks:
- Muss man den Timer noch irgendwie starten oder laeuft der los, sobald ich TCCR0 vom default 0x00 auf 0x05 stelle?
- Muss ich mit dem PORTC noch irgendwas besonderes machen, bevor ich ihn normal benutzen kann? Ich hab hier Forum schon oefter was ueber JTAG gelesen, aber wenn ich mir die Fuses in AVR Studio (damit programmiere ich) anschaue, seh ich da nirgendwo den Begriff JTAG...

Kann jemand helfen?

Nils

PS: Nicht ueber die Werte fuer die defines wundern, ich muss wegen der Anornung des Ports auf dem STK jeden zweiten Pin des Bytes nehmen und habe wie gesagt alle Bits invertiert...

Minifriese
02.02.2005, 21:01
OK, das "Zufallsmuster" kam durch meine Daemlichkeit. Wenn ich alle Bits invertiere, muss ich natuerlich bei den defines statt 0x02 auch 0xFD schreiben und nicht 0x0D...

Bleiben die Fragen: Warum sind die Ausgaenge des AVRs bei logisch 1 auf 0v und bei logisch 0 auf 5V, und wieso laeuft der Timer0 nicht los?

02.02.2005, 22:02
Hallo

Um den Overflow1 Int benutzen zu können, mußt du im TIMSK Reg. noch ein Bit setzen. Der Timer läuft los, sobald er mit einem Takt versorgt wird.

MFG
Dieter

Hannebambel
02.02.2005, 22:28
Der mega 8 invertiert deine ports nicht das macht das stk 500 led an ist logisch low und umgekehrt

Minifriese
02.02.2005, 22:34
Nabend,

Besten Dank fuer die Antworten!
Das mit dem TIMSK war genau das, was mir fehlte. Und das mit den LEDs auf dem STK war ich gerade am nachmessen, mein Schrittmotor konnte naemlich mit den invertierten Signalen nix anfangen ;-)
Nils