Forum: Mikrocontroller und Digitale Elektronik ATtiny10 Timer0


von Lucky Luke (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

>   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);
  }

von Peer (Gast)


Lesenswert?

Lucky Luke schrieb:
> if ((PORTB && 0x2) == 0x2){

Ist es Absicht, daß du PORTB abfragst? Status ermittelt man über PINB.

Was meinst du mit abfangen?

von MWS (Gast)


Lesenswert?

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.

von Lucky Luke (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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)

von Thomas E. (thomase)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

Hi

>Also ich lass' ja immer so blinken: PORTB ^= (1 << PB1);

Geht bei neueren AVRs schneller über das Pin-Register.

MfG Spess

von Lucky Luke (Gast)


Lesenswert?

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

von MWS (Gast)


Lesenswert?

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.

von Lucky Luke (Gast)


Lesenswert?

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);
      }
}

von spess53 (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.