Programm funktioniert nicht

Gast #1436763
Lesenswert?

Hallo,

habe folgenden Code mit der ich eine LED blinken lassen möchte 
(Attiny2313 - 8MHz). Leider blinkt die LED an dem Port nicht in dem 
gewollen Takt von 1Hz. Derzeit ist die LED etwa 12sec an und 40sec aus. 
Ich finde den Fehler nicht.

#include <avr/io.h>
#include <avr/interrupt.h>


volatile int Impuls;

ISR(TIMER0_OVF_vect)
{
  Impuls++;
}

int main (void)
{
DDRB = 0x0F; //Bit1-4 Eingang und 5-8 Ausgang
PORTB = 0x00; //Pullups deaktivieren und Ausgänge = 0


TCCR0B |= (1 << CS02) | (1 << CS00); //Prescaler auf 1024 stellen
  TIMSK  |= (1 << TOIE0);              // Timer 0 Overflow Interrupt ena


while(1) {

sei();

  if (Impuls==31)
  {
    PORTB= PINB ^ (1<<PB0);
    Impuls = 0;
  }


cli();
}
return (1);

}
Gast #1436780
Lesenswert?

> Mach mal aus dem "if (Impuls==31)" ein "if (Impuls >= 31)
das ist egal, weil dafür die schleife schnell genug ist.

aber das hier kommt mir nicht sauber vor

> PORTB= PINB ^ (1<<PB0);
warum PINB? damit verwendest du ja einen Eingang - ist das gewollt oder 
ist es von mir ein denkfehler?
Gast #1436794
Lesenswert?

Hallo

habe beides ausprobiert jedoch ohne Erfolg. Ob ich PINB oder PORTB zum 
einlesen verwende dürfte eigentlich keinen Unterschied ergeben.

Die Funktion ist in etwa vorhanden. Die LED geht an (ca. 20sec) und aus 
( ca. 7,8sec).

Warum die Unterschiedlichen Zeiten? Zudem sollte es sich um 1HZ handeln. 
Warum passt die Zeit nicht?

ATTiny mit internen 8MHz Quarz --> mit Prescaler 1024 = 0,128ms/zyk.

Ich zähle den Counter 1 bis 256 woraus sich ergibt:

0,128ms/zyk * 256 = 0,033 Bei 1Hz die ich haben will ergibt das etwa 31 
Impulse die ich zählen muss.
Moderator (Firma: Titel) Persönliche Seite #1437439
Lesenswert?

Warum dauernd (und zudem an der falschen Stelle) mit den Interrupts 
herumbasteln?

1
  sei();
2

3
  if (Impuls==31)
4
  {
5
    PORTB= PINB ^ (1<<PB0);
6
    Impuls = 0;
7
  }
8

9
  cli();
Du hast ein Semaphorenproblem:
Wie wird der Integer (Impuls) auf 0 setzt? Erst wird ein Byte auf 0 
gesetzt, dann (...) das andere.
Was, wenn jetzt bei den (...) ein Interrupt kommt?

Probiers mal so:
1
  if (Impuls==31)
2
  {
3
    PORTB= PINB ^ (1<<PB0);
4
    cli();
5
    Impuls = 0;
6
    sei();
7
  }
Gast #1438008
Lesenswert?

Danke für den Tipp. Ich gebe Dir recht das das nicht ganz richtig ist, 
jedoch löst das nicht mein Problem.

Wenn ich das Programm mit dem AVRStudio Simulator teste funktioniert es 
einwandfrei.
Daher vermute ich das irgendwas mit dem Makefile nicht stimmt. Ich hab 
zwar keine Ahnung warum und wieso aber....

wie schon öfters gesagt. Warum sind die An bzw. Aus-zeiten 
unterschiedlich. Das kann noch nicht einmal an einer Einstellung im 
Makefile leigen, oder?
Gast #1438052
Lesenswert?

Hallo Ingo,
Ich gehe davon aus, das du die Fuses nicht programmiert hast, sodass 
sich diese noch im Defaultzustand befinden. Die Original-Atmeldoku 
(Seite 25, "Default Clock Source") sagt dazu folgendes:

The device is shipped with CKSEL = “0100”, SUT = “10”, and CKDIV8 
programmed.
The default clock source setting is the Internal RC Oscillator with 
longest start-up time and an initial system clock prescaling of 8,
*resulting in 1.0 MHz system clock.* ...

Also läuft der Controller mit 1 MHz, und nicht 8.
Gast #1438199
Lesenswert?

Hallo,

Danke für den Tipp. Trotzdem hab ich noch das Problem das die 
Einschaltzeit im Verhältniss zur Ausschaltzeit etwa bei 1:3 leigt. Das 
ist mein größeres Problem. ich verstehe nicht wie das zustande kommen 
kann

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren