Hallo, Ich möchte gerne per Zufall die Ausgänge PB0 bis PB3 per Zufall schalten; Also: PB0 ein oder PB1 ein und PB2 ein oder PB3 ein Eine zweite Frage möchte ich hier gleich anschließen: Wie mache ich eine Pause? Die Ausgänge sollen nämlich für einige Sekunden so bleiben und dann wechseln. In einer Schleife eigentlich kein Problem, hoffe ich. Danke schonmal Gruß Florian
Hi, du koenntest ein (oder mehrere) ADC Input nehmen und das rauschen einer Diode messen. Die Pause kannst du ueber eine Zeilerschleife machen. Besser waere es natuerlich dafuer nen Timer zumissbrauchen z.B. Timer0 im Overflow Betrieb. Gruß, Dirk
öhm, also ich hatte mich ja schon damit abgefunden dass Assembler nicht so einfach zu verstehen ist wie Visual Basic :P , aber immerhin verstehe ich den Beispiel-Code im Tutorial (zumindest bis Teil 2. IO-Grundlagen )... Allerdings habe ich keine Ahnung was du mir zu sagen versuchst :-/
Für lange Delays ist der Watchdog-Timer ein gutes Missbrauchsobjekt. Mein allererstes Mikrocontrollerprogramm war eins, das zwei LEDs hat wechselblinken lassen. Dazu hatte ich den Watchdog-Timer auf 0,25s Timeout gestellt und in dessen Interrupt-Handler die LEDs getoggelt. In der Hauptschleife hab ich den Controller einfach schlafen gelegt ;-)
@rolf Hast du dieses Programm noch (sagen wir mit zwei LED's An PB0 und PB1) ? Ich hab hier eins, aber das funktioniert nicht. .include "4433def.inc" ldi r16, 50 ldi r17, 0xFF out DDRB, r17 loop1: if1: cpi r16, 100 brne else1 ldi r17, 0b00000001 out PORTB, r17 ldi r16, 50 rjmp endif1 else1: ldi r17, 0b00000010 out PORTB, r17 ldi r16, 100 endif1: ldi r17, 255 while1: subi r17, 1 breq endwhile1 nop rjmp while1 endwhile1: rjmp loop1
Naja, ich hab mal kurz in das Datenblatt deines Controllers geschaut und gesehen, daß der mit meinem Programm nicht laufen wird, da der Watchdog-Timer keinen eigenen Interrupt hat. Meins ist halt für einen ATtiny13 gedacht. Ich hab's trotzdem mal angehängt. Man könnte es ja so modifizieren, daß es einen normalen Timer verwendet. Schauen wir uns mal dein Programm an. > .include "4433def.inc" > > ldi r16, 50 > ldi r17, 0xFF Einfacher: ser r17 > out DDRB, r17 > loop1: > > if1: > cpi r16, 100 > brne else1 > ldi r17, 0b00000001 ldi r17, (1 << PORTB0) > out PORTB, r17 > ldi r16, 50 > rjmp endif1 > else1: > ldi r17, 0b00000010 ldi r17, (1 << PORTB1) > out PORTB, r17 > ldi r16, 100 > endif1: > Generell dürfte dein Programm vermutlich einfach viel zu schnell ablaufen. Schauen wir uns mal die Dauer der Warteschleife an: > ldi r17, 255 > while1: > subi r17, 1 1 Taktzyklus > breq endwhile1 1 Taktzyklus, wenn false, sonst 2 > nop 1 Taktzyklus > rjmp while1 2 Taktzyklen Macht also 5 Taktzyklen pro Schleifendurchlauf. Die für das ldi und der zusätzliche für den breq am Ende vernachlässigen wir mal. Bei 255 Schleifendurchläufen macht das 1275 Taktzyklen. Ich weiß nicht, bei welchem Takt du den Controller betreibst, aber bei 1MHz wäre deine Warteschleife in gut 1,2 Millisekunden fertig. Deine LEDs würden also mit einer Frequenz von über 400 Hz wechselblinken. Falls dein Takt höher ist, natürlich entsprechend schneller. Entweder mußt du auf Timer ausweichen, oder du mußt deine Warteschleife auf einen 16bittigen Schleifenzähler erweitern, um genug Zeit kaputtzumachen, damit die Blinkgeschwindigkeit für Menschen wahrnehmbar wird. > endwhile1: > rjmp loop1
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.