Hallo, hat jemand Erfahrungen mit dem ATtiny10 und der Timer-Funktion ? Hier mein Code: #include <avr/io.h> #include <avr/interrupt.h> #include <stdint.h> // Declare your global variables here ISR (TIMER0_OVF_vect){ TCNT0=60000; if ((PORTB && 0x2) == 0x2){ PORTB &= ~(1<<PB1); } else{ PORTB |= (1<<PB1); } } int main(void) { DDRB=0xf; TIMSK0 |= (1<<TOIE0); TCCR0B |= (1<<CS00); TCCR0B &= ~(1<<CS01); TCCR0B |= (1<<CS02); TCNT0=60000; sei(); while (1) { PORTB |= (1<<PB0); PORTB &= ~(1<<PB0); } } Ich möchte den Timer OVERFLOW abfangen, wo ist der Fehler ? Vielen Danke für Eure Hilfe ! Gruß Luke
> if ((PORTB && 0x2) == 0x2){
bitweises UND, nicht logisches:
if ((PORTB & 0x2) == 0x2){
und den Vergleich mit 0x02 sparst du dir besser. Ist weniger
fehleranfällig in der Programmierung. "Nicht 0" ist mehr als
ausreichend. Und genau das wird gemacht, wenn du nur den arithmetischen
Ausdruck hinschreibst.
if (PORTB & 0x2){
Und wenn du dann nocht die 0x2 in der Form 1<<PB1 ausdrückst, ist auch
noch dem letzten klar, dass es zwischen der Abfrage und der zugehörigen
Aktion einen Zusammenhang gibt
if (PORTB & (1<<PB1)){
PORTB &= ~(1<<PB1);
}
else{
PORTB |= (1<<PB1);
}
Lucky Luke schrieb: > if ((PORTB && 0x2) == 0x2){ Ist es Absicht, daß du PORTB abfragst? Status ermittelt man über PINB. Was meinst du mit abfangen?
Liest Du Dir eigentlich die Antworten nicht durch ? Beitrag "Problem mit ATtiny10" Wenn Du nicht in der Lage bist den erzeugten Code zu überprüfen, d.h. zu disassemblieren, dann ist es auf keinen Fall ratsam mit diesem µC etwas in C zu machen. Das wurde Dir aber bereits gesagt.
Hallo Peer, der ATtiny10 hat nur den PORTB und damit ich was sehe habe ich mir 2 Bits vom PORTB eingebaut. Mein Problem liegt wohl im einrichten des Timers ?! Gruß Luke
Peer schrieb: > Lucky Luke schrieb: >> if ((PORTB && 0x2) == 0x2){ > > Ist es Absicht, daß du PORTB abfragst? Status ermittelt man über PINB. Er will offenbar den Pin blinken lassen. Von daher ist an dieser Stelle PORTB schon ok. Er muss nur die Abfrage richtig machen. (Und natürlich all das Zeug aus dem anderen Thread berücksichtigen. Welcher Teufel hat den TO eigentlich zu einem Tiny10 geraten? Noch blöder gehts nun wirklich nimmer)
Karl Heinz Buchegger schrieb: > if (PORTB & (1<<PB1)){ > PORTB &= ~(1<<PB1); > } > else{ > PORTB |= (1<<PB1); > } > Er will offenbar den Pin blinken lassen. Also ich lass' ja immer so blinken: PORTB ^= (1 << PB1); mfg.
Hi >Also ich lass' ja immer so blinken: PORTB ^= (1 << PB1); Geht bei neueren AVRs schneller über das Pin-Register. MfG Spess
Es ist wohl besser das dieser Thread geschlossen oder besser gelöscht wird. Wenn ich schon alles über µC wüsste, hätte ich auch keine Fragen. Danke an Alle die mir helfen wollten ! Luke
Karl Heinz Buchegger schrieb: > Er muss nur die Abfrage richtig machen. Und er muss den Vektor richtig nennen. Wobei ihm das der Compiler bereits per Warnung mitgeteilt hat. Lucky Luke schrieb: > Es ist wohl besser das dieser Thread geschlossen oder besser gelöscht > wird. Wenn ich schon alles über µC wüsste, hätte ich auch keine Fragen. Das ist es nicht, Du bist nur verständnisresistent. Es haben Dir mindestens zwei Leute, die sich mit dem Teil auskennen, gesagt: lass es, nimm Assembler dafür. Das Teil ist schwierig, hat nur 'nen Teil der üblichen Prozessorregister und dann auch noch das Problem mit dem AVR GCC, der falschen Opcode einbaut. Aber das ist Dir alles wurscht, Du ignorierst es einfach, aber dann wird das aber auch nix und Du musst auch nicht beleidigte Leberwurst spielen.
Und es lebt doch .... #include <avr/io.h> #include <avr/interrupt.h> #include <stdint.h> // Declare your global variables here ISR (TIM0_OVF_vect){ TCNT0=64588; if ((PORTB & 0x2) == 0x2){ PORTB &= ~(1<<PB1); } else{ PORTB |= (1<<PB1); } } int main(void) { DDRB=0xf; TIMSK0 |= (1<<TOIE0); TCCR0B |= (1<<CS00); TCCR0B &= ~(1<<CS01); TCCR0B |= (1<<CS02); TCNT0=64588; sei(); while (1) { PORTB |= (1<<PB0); /*if(TIFR0 & (1<<TOV0)){ if ((PORTB & 0x2) == 0x2){ PORTB &= ~(1<<PB1); } else{ PORTB |= (1<<PB1); } }*/ PORTB &= ~(1<<PB0); } }
Hi >Und es lebt doch .... Schwere Geburt. Aber das: >TCNT0=64588; ist unnötig. Dafür gibt es CTC. MfG Spess
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.