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...
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...