Forum: Compiler & IDEs Programm funktioniert nicht


von Ingo (Gast)


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

}

von Daniel (Gast)


Lesenswert?

Mach mal aus dem "if (Impuls==31)" ein "if (Impuls >= 31)".

von Peter (Gast)


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?

von Ingo (Gast)


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.

von Peter (Gast)


Lesenswert?

warum nimmt du nicht einfach den Simulator und gehst es mal im 
einzelschritt durch?

von Ingo (Gast)


Lesenswert?

Hallo

welchen Simulator? Bin noch recht unerfahrne in Sachen Programmieren...

von Ingo (Gast)


Lesenswert?

verwende zum programmieren den WinAVR.

von ich (Gast)


Lesenswert?

Port PB0 toggeln?
Dann stell ihm mal auf Ausgang, sonst toggelst du nur den Pull-UP

von Ingo (Gast)


Lesenswert?

Kannst Du mir nen Tipp geben wie?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Und es ist sicher, daß der Controller mit dem gewünschten Takt läuft? 
Nur weil Du einen entsprechenden Quarz anschließt und das #define im 
Compiler so setzt, heißt das noch nicht, daß der auch mit dieser 
Frequenz läuft. Das muss mit den sogenannten fuses konfiguriert 
werden. Hast Du das gemacht?

von Klaus W. (mfgkw)


Lesenswert?

Ingo schrieb:
> Kannst Du mir nen Tipp geben wie?

Schon mal das Tutorial angesehen (links oben)?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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
  }

von Ingo (Gast)


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?

von Michael (Gast)


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.

von Ingo (Gast)


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

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.