mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega328 Pin toggeln geht nicht


Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 Moderator
Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Chris schrieb:
> PORTD ^= PD7;

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

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
chris schrieb:
> Chris schrieb:
>> PORTD ^= PD7;
>
> -->
> PORTD ^= (1<<PD7);

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

Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Toni55 (Gast)
Datum:

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

gruß toni

Autor: Ingo Less (corrtexx)
Datum:

Bewertung
0 lesenswert
nicht 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
init(); 

: Bearbeitet durch User
Autor: Holger L. (max5v)
Datum:

Bewertung
1 lesenswert
nicht 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
Autor: Toni R. (torei55)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ingo L. schrieb:
> ... Da braucht er keine Interrupts ... <

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.