Dein Programm funktioniert bei mir. Atmel defekt?
Ja, der Code oben stimmt nicht mehr ganz, hier der Versuch, nur den Port so kurz wie möglich auf High zu schalten
Nur bleibt der Port halt wie gesagt für ca. 9mS High, und da ich bis jetzt noch nie ein Signal selbst erzeugen wollte, weiß ich nicht ob das jetzt normal ist, sprich das Umschalten der Ports wirklich so lange dauert, oder ob ich hier einfach etwas übersehen habe.Code:#include <avr/io.h> #include <avr/interrupt.h> ISR(TIMER0_OVF_vect) { TCNT0 = 176; PORTD =0x40; // PORTD6 auf High setzen PORTD =0x00; // PORTD auf Low setzen } int main () { DDRD=0xff; // PORTD6 auf Ausgang PORTD =0x00; // PORTD vorsichtshalber mal auf Low gesetzt TCCR0 |= (1<<CS00); TCNT0 = 176; TIMSK |= (1<<TOIE0); sei(); do { } while (1); }
Weil bei "längeren" Signalen gehts ja, nur nicht unter 9mS, was ich halt seltsam finde, da ich denke am Umschalten kanns doch nicht liegen, eine PWM z.B. kann den Port ja auch so schnell schalten, nur auf meine manuelle Art klappt es einfach nicht.
Dein Programm funktioniert bei mir. Atmel defekt?
Hallo,
kannst du an einen anderen PORT eine LED anschließen, die du gleich am Anfang der Main über ein High Signal einschaltest? Nur einschalten, nichts anderes, der Rest des Programms und der weitere Aufbau bleiben wie sie sind. Jetzt beobachte an der LED mit dem Oszi das Signal. Ohne den Schaltplan zu kennen, mich beschleicht der Gedanke nach einem Reset, ausgelöst durch ein Hardwareproblem.
Gruß
Jens
So, jetzt hab ichs hinbekommen, ich habe zwar keine Ahnung warum es jetzt funktioniert aber es geht auf einmal nach mehrmaligem brennen.
Ich habe langsam den Verdacht das mein PC der Übeltäter ist...
Also Danke für euren ganzen Tipps, damit kann ich jetzt schonmal das STK500 + AVR als Fehlerquelle ausschließen![]()
Jetzt für alle die Interessiert sind, hiermit bekomme ich ein ca. 1mS High + 19mS Low
Code:#define F_CPU 8000000L #include <avr/io.h> #include <avr/interrupt.h> volatile int time=0; ISR(TIMER0_OVF_vect) { TCNT0 = 176; time++; if (time<=80) { PORTD =0x40; // PORTD6 auf High setzen } if (time>=80 && time<=1600) { PORTD=0x00; } if(time>=1600) { time=0; } } int main () { DDRD=0xff; // PORTD6 auf Ausgang TCCR0 |= (1<<CS00); TCNT0 = 176; TIMSK |= (1<<TOIE0); sei(); do { } while (1); }
OK. aber da ändert sich nichts
PORTC0 ist 1 , auf PORTD6 sind kurze Impulse
---------------
#include <avr/io.h>
#include <avr/interrupt.h>
ISR(TIMER0_OVF_vect)
{
TCNT0 = 176;
PORTD =0x40; // PORTD6 auf High setzen
PORTD =0x00; // PORTD auf Low setzen
}
int main ()
{
DDRD=0xff; // PORTD6 auf Ausgang
PORTD =0x00; // PORTD vorsichtshalber mal auf Low gesetzt
TCCR0 |= (1<<CS00);
TCNT0 = 176;
TIMSK |= (1<<TOIE0);
DDRC =1; //so?
PORTC =1;
sei();
do
{
}
while (1);
}
Hallo,
wenn der Controller sich ständig resetet hätte, würde man das an dem Signal der LED erkennen können. Aber nun geht es ja.
Gruß
Jens
gut.
Und nun such mal den Fehler in deinem alten Programm, sonst hast du nichts dazu gelernt, sondern nur rumprobiert.
Lesezeichen