Forum: Mikrocontroller und Digitale Elektronik avr eifaches Programm mit Registern TCCR1A, umsetzen


von Max F. (Gast)


Lesenswert?

Hi,
bin absoluter Neuling in dem Bereich und wäre um Hilfe dankbar. Und zwar 
hätte ich eine Aufgabe zu lösen.
Folgendes Programm ist gegeben:

#include <avr/io.h>
int main (void)
{
    int i = 0xFF;
    while(1)
    {
    while(i>0)
    {
        DDRC = 0xFF;
        PORTC = i;
       i--;
       _delay_ms(600);
    }
    }
}

Soweit ich das beurteilen kann (oder verstanden habe) müssten erst alle 
LEDs an sein und alle 600 ms eine abgeschaltet werden.
Nun würde ich gerne das selbe Ergebnis mithilfe folgender Register 
bekommen: TCCR1A, TCCRB1B und TCNT1. Habe mir zwar schon ein paar 
Beispiele für diese Timer angesehen doch werde daraus nicht schlau. Wie 
müsste das Programm ausschauen?
Vielen Dank schon mal.

von Dieter F. (Gast)


Lesenswert?

Max F. schrieb:
> Und zwar
> hätte ich eine Aufgabe zu lösen.

https://www.mikrocontroller.net/articles/AVR-Tutorial

von Jim M. (turboj)


Lesenswert?

Riecht wie 'ne Hausaufgabe.

Für die ersten Gehversuche in der Programmiersprache C empfehle den PC 
zu verwenden und keinen µC. Dort findet man die Fehler einfacher...

von Dieter F. (Gast)


Lesenswert?

Max F. schrieb:
> Nun würde ich gerne das selbe Ergebnis mithilfe folgender Register
> bekommen: TCCR1A, TCCRB1B und TCNT1. Habe mir zwar schon ein paar
> Beispiele für diese Timer angesehen doch werde daraus nicht schlau. Wie
> müsste das Programm ausschauen?

Trollig :-)

von Dieter F. (Gast)


Lesenswert?

Max F. schrieb:
> Soweit ich das beurteilen kann (oder verstanden habe) müssten erst alle
> LEDs an sein und alle 600 ms eine abgeschaltet werden.

Bonusfrage: Wie viele LED's sind denn an PORTC eines geeigneten 8-Bit 
AVR-MC (direkt) zu schalten?

von Dieter F. (Gast)


Lesenswert?

Max F. schrieb:
> Und zwar
> hätte ich eine Aufgabe zu lösen.

Ja - DU - und Du kannst mir gerne noch weitere Minus-Punkte geben - die 
stören mich nicht :-)

Schau Dir bitte das Tutorial an und arbeite Dich durch. Mag sein, dass 
Dir hier irgend jemand etwas vorkaut - aber das hilft Dir nicht 
wirklich.

von Irgendwer (Gast)


Lesenswert?

Max F. schrieb:
> alle
> LEDs an sein und alle 600 ms eine abgeschaltet werden.

Nö, überlege noch mal genauer was passiert wenn du von 0xFF auf Null 
runterzählst.

Und ab den zweiten Durchlauf ist dein Programm sowieso murks.

von HildeK (Gast)


Lesenswert?

Irgendwer schrieb:
> Nö, überlege noch mal genauer was passiert wenn du von 0xFF auf Null
> runterzählst.
... und mit einer int-Variable bei 0xFF anfängst ...


> Und ab den zweiten Durchlauf ist dein Programm sowieso murks.
schon von Anfang an, 0xFF ist immer kleiner Null.

von Dieter F. (Gast)


Lesenswert?

Ohne

#include <avr/delay.h>

ist es sicher nicht lauffähig (-3 mindestens - bitte :-))

Der Rest ist aus genannten Gründen Unsinn (das ist mindesten -4 wert!) 
:-)

von Abel H. (abel)


Lesenswert?

Dieter F. schrieb:
> -3 mindestens - bitte :-))
>
> Der Rest ist aus genannten Gründen Unsinn (das ist mindesten -4 wert!)
> :-)

Mach doch keine ungesunde Hektik. Das kommt schon noch zusammen.
:)

(Durch mich nicht -mir ist das Wumpe)

Abel

von Dieter F. (Gast)


Lesenswert?

> Das kommt schon noch zusammen.

Yep - sehe ich auch so. Hektik ist für andere (U50) :-)

von Walter S. (avatar)


Lesenswert?

HildeK schrieb:
> 0xFF ist immer kleiner Null

ein int beim avr hat doch 16 Bit?!

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Walter S. schrieb:
> ein int beim avr hat doch 16 Bit?!

Wäre mir neu, wobei ich mich mit C nicht sonderlich auskenne.
Worauf wohl hinaus gegangen werden wollte - es gibt die Bytes als mit 
und ohne Vorzeichen (signed).
Ohne Vorzeichen kann ein Byte 0...255 als Wert haben.
Mit Vorzeichen -128...127, wobei das oberste Bit das Vorzeichen 
darstellt - und bei 0xFF ist das oberste Bit gesetzt, somit der Wert 
negativ (wenn Du Das nicht willst, musst Du die Variable mit uint8 
(unsigned integer 8 bit ... denke ich - wobei C auch längere Zahlen 
zulässt, was aber Nichts mit den Interner des µC zu tun haben muß, darum 
kümmert sich, zur Not, der Compiler) definieren.

Aber auch dann gehen die 'ganzen LED' nicht der Reihe nach aus - wäre 
auch blöd, da halt nur 8 LED vorhanden sind (8 Bit) - dafür blinken 
Diese dann schön hin und her, bis denn Alle doch aus sind (nach 255 
Schritten)

Du musst übrigens nicht bei jedem Schleifendurchlauf das 
Richtungsregister neu auf 0xFF setzen - Das ändert sich nur, wenn Du Das 
änderst - von Selbst passiert da gar nix.

MfG

von Max F. (Gast)


Lesenswert?

Danke, da hab ich schon mal reingeschaut.

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.