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.
Max F. schrieb: > Und zwar > hätte ich eine Aufgabe zu lösen. https://www.mikrocontroller.net/articles/AVR-Tutorial
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...
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 :-)
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?
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.
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.
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.
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!) :-)
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
> Das kommt schon noch zusammen.
Yep - sehe ich auch so. Hektik ist für andere (U50) :-)
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.