Forum: Mikrocontroller und Digitale Elektronik Atmega328 Pin toggeln geht nicht


von Chris (Gast)


Lesenswert?

Hallo,
ich kann bei dem IC den Pin nur auf High aber nie wieder auf LOW setzen.

#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

int main(void) {
  init();

    DDRD = (1<<PD7);
    TCCR1B |= _BV(CS10); // Set up timer

 while(1)
    {
        if (TCNT1 >= 49999){
            PORTD ^= PD7;
            TCNT1 = 0; // Reset timer value
        }

    }

  return 0; // never reached
}

Der Atmega läuft mit 8Mhz und ist fest mit einem Board verlötet.
Gruß

: Verschoben durch User
von chris (Gast)


Lesenswert?

Chris schrieb:
> PORTD ^= PD7;

-->
1
PORTD ^= (1<<PD7);

von Chris (Gast)


Lesenswert?

chris schrieb:
> Chris schrieb:
>> PORTD ^= PD7;
>
> -->
> PORTD ^= (1<<PD7);

Sry hab ich natürlich so getestet. Aber tut sich trotzdem nichts!

von Chris (Gast)


Lesenswert?

Chris schrieb:
> chris schrieb:
>> Chris schrieb:
>>> PORTD ^= PD7;
>>
>> -->
>> PORTD ^= (1<<PD7);
>
> Sry hab ich natürlich so getestet. Aber tut sich trotzdem nichts!

Standard laufen die Atmegas alle auf internal clock ? Ich habe so eine 
Ahnung das es daran liegt!
Wo setzt man die am besten/sinnvollsten wenn man ein Makefile zum 
erzeugen und brennen benutzt ?

von Toni55 (Gast)


Lesenswert?

wo setzt du denn den interrupt? -> TIMSK1 !!!
und gibst ihn frei? -> SEI() !!!

gruß toni

von Ingo L. (corrtexx)


Lesenswert?

Toni55 schrieb:
> wo setzt du denn den interrupt? -> TIMSK1 !!!
> und gibst ihn frei? -> SEI() !!!
Er startet einen Timer und fragt das Zählregister ab. Da braucht er 
keine Interrupts, auch wenn hier der CTC-Modus prädestiniert wäre, der 
macht der ganzen Kram in Hardware ohne auch nur 1% CPU Belastung ;)

> Standard laufen die Atmegas alle auf internal clock ? Ich habe so eine
> Ahnung das es daran liegt!
Eher weniger, wichtig ist das er überhaupt läuft.

Also an dem geposteten Code kann ich nichts falsches sehen. Was 
geschieht in
1
init();

: Bearbeitet durch User
von Holger L. (max5v)


Lesenswert?

Wenn ich mich nicht komplett verrechnet habe sollte die Led ca. 160 mal 
pro Sekunde toggeln. Das menschliche Auge ist allerdings ein wenig 
träge, weshalb das ein-ausschalten der Led's vermutlich nicht gesehen 
werden kann und als dauerhaftes leuchten wahrgenommen wird.

Kannst ja mal versuchen den Prescaler zu erhöhen,
CS11 für Prescale 8 statt wie momentan
CS10 für Prescale 1.

: Bearbeitet durch User
von Toni R. (torei55)


Lesenswert?

Ingo L. schrieb:
> ... Da braucht er keine Interrupts ... <

er includiert aber "#include <avr/interrupt.h>"
daher dachte ich :-(

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.