Hey Ich versuche eine Blink Schaltung mit einem Attiny 13 aufzubauen. Wie muss ich den Timer programmieren das ich über ein Poti das am Analog Port hängt eine Frequenz von 0,2HZ bis 2 HZ einstellen kann? Lg
Ho Das bleibt doch dir überlassen. Ich denke mal du wirst einen linearen Zusammenhang zwischen Poti Stellung und Frequenz anstreben. Bei Widerstand Null 0.2 Hz, bei Widerstand maximal 2 Hz; linear steigend. Ein anderer findet sicher eine quadratische Kennlinie oder was logarithmisches sinnvoller für seinen Zweck.
Also ich strebe eine lineare Regelung an. Nur wie realisier ich die?
Um eine Kennlinie (außer linear) zu implementieren ist das Stichwort "Look-up-Table" noch ganz hilfreich... Aber Du willst ja eine lineare.
mh....ich finde seine Aufgabenstellung sehr interessant! Erst mal werde ich mir den Tiny13 mit seinen Analogeingang hardwaremäßig vornehmen und lesen und lesen. In der Steuerungstechnik kenne ich mich mit den kleinen und Tiny2313 ganz gut aus (hab jetzt eine Ampelsteuerung für Moelleisen- bahn erstellt) aber was das analoge anbetrifft bin ich noch ne Niete. Mal sehen, was dabei raus kommt. Bei Karl Heinz Buchegger weiß ich doch, daß er auch mal bereit ist, kleine Denkanstösse zu geben, wenn er merkt, daß die Anderen mitarbeiten! Grüße Rolf
Hallo, wenn du für den ADC die VCC als Referenz auswählst, dann kannst du ein Poti direkt zwischen VCC und GND hängen und führst den Mittelabgriff auf den ADC Pin. Aus dem ADC Wert errechnest du dann entsprechend die Periodendauer für dein Blinksignal und stellst damit den Timer ein, damit ein Timerdurchlauf genau so lange dauert. Wenn du für den Timer den Fast PWM Modus wählst stellst du die Periodendauer durch die Obergrenze des Timers ein und das Blinkverhältnis (Zeit an zu Zeit aus) über den Output Compare. Wenn es symmetrisch blinken soll ist der Compare Wert einfach die Hälfte des Überlaufwertes. Der Ausgangspin am Controller ist dann einfach der OC0A oder OC0B Pin. Gruß Kai
Ein MC kann auch rechnen:
1 | #define F_CPU 1.2e6
|
2 | |
3 | #include <avr/io.h> |
4 | #include <util/delay.h> |
5 | |
6 | int main() |
7 | {
|
8 | // init ADC, Output pin here
|
9 | for(;;){ |
10 | for( uint16_t i = 284000UL / (ADC + 113); i; i-- ) |
11 | _delay_ms( 1 ); |
12 | PORTB ^= 1<<PB0; |
13 | }
|
14 | }
|
o weia..Peter Dannegger, ich als Assembler-Freak verstehe leider die C Sprache nicht. zu Kai....habe mir schon gedacht, daß man sich erst mal mit "PWM" beschäftigen muß und dann mit dem analogen Teil weiter arbeiten sollte. Hatte heute einen schweren Modellhubi-Absturz (mit Logo500) das haut mich erstmal mit der Zeit zurück, aber ich bleibe am Ball. Grüße Rolf
>o weia..Peter Dannegger, >ich als Assembler-Freak verstehe leider die C Sprache nicht.
1 | int main() |
2 | {
|
3 | // init ADC, Output pin here
|
4 | for(;;){ |
5 | for( uint16_t i = 284000UL / (ADC + 113); i; i-- ) |
6 | _delay_ms( 1 ); |
7 | PORTB ^= 1<<PB0; |
8 | }
|
9 | }
|
Ich übersetzte das mal:
1 | int main() |
2 | {
|
3 | // init ADC, Output pin here
|
4 | for(;;) // tue das in den Klammer fuer immer |
5 | {
|
6 | uint16_t zaehler=284000UL / (ADC + 113); // weise einem 16 bit zaehler den umgerechneten ADC Wert zu |
7 | while(zaehler>0) // so lange der zaehler groesser 0 |
8 | {
|
9 | _delay_ms( 1 ); // eine Millisekunde Verzoegerung |
10 | PORTB = PORTB^1 // Exclusive Oder von Port B mit 1 ( toogle bit ) |
11 | }
|
12 | }
|
13 | }
|
.... upps ... in der Schleife fehlt noch zaehler=zaheler-1;
Hallo, hab aus meinen Buch einen umfangreichen Artikel über "Analog-Digitalwandler" entdeckt mit einer zugehörigen .asm Datei, also in Assembler. Das Ganze ist auf einen ATmega8 zugeschnitten und werde versuchen, dies auf einen Tiny13 oder 2313 umzubusseln. Verstehen muß ich das SFR-Register ADMUX mit seinen 8 Bit Da kommt was auf mich zu!
1 | Hier der Code: |
2 | ; k4p22.asm ATmega8 Test des Analog/Digitalwandlers |
3 | ; Port B: High-Teil des 10bit Analogwertes |
4 | ; Port C: PC0 ADC0 10 kOhm Potentiometer |
5 | ; Port D: Low-Teil des 10bit Analogwertes |
6 | ; Konfiguration: interner Oszillator; externes Reset-Signal |
7 | .INCLUDE "m8def.inc" ; Deklarationen |
8 | .DEF akku = r16 ; Arbeitsregister |
9 | .CSEG ; Programmsegment |
10 | rjmp start ; |
11 | .ORG $13 ; keine Interrupts |
12 | start: ldi akku,LOW(RAMEND) ; Stapel anlegen |
13 | out SPL,akku ; |
14 | ldi akku,HIGH(RAMEND) ;das brauch ich bei den Tinys nicht |
15 | out SPH,akku ;kann ich also alles weglöschen,oder? |
16 | ldi akku,$ff ; |
17 | out DDRB,akku ; Port B ist Ausgang |
18 | out DDRD,akku ; Port D ist Ausgang |
19 | ldi akku,(0 << REFS1) | (0 << REFS0) | (0 << ADLAR) | 0; |
20 | out ADMUX,akku ; Referenz, rechtsbündig, Kanal 0 |
21 | ldi akku,(1 << ADEN) | (1 << ADSC) | (1 << ADPS1) | (1 << ADPS0); |
22 | out ADCSRA,akku ; Wandler ein und starten, Einzel, Teiler 8 |
23 | loop: sbic ADCSRA,ADSC ; überspringe wenn Wandlung beendet |
24 | rjmp loop ; warte auf Ende der Wandlung |
25 | in akku,ADCL ; erst Low-Byte |
26 | out PORTD,akku ; nach Port D |
27 | in akku,ADCH ; dann High-Bits |
28 | out PORTB,akku ; nach Port B |
29 | sbi ADCSRA,ADSC ; Wandler neu starten |
30 | rjmp loop ; Schleife |
31 | .EXIT ; Ende des Quelltextes |
Hi >Das Ganze ist auf einen ATmega8 zugeschnitten und werde versuchen, >dies auf einen Tiny13 oder 2313 umzubusseln. Der ATTiny2313 hat keinen ADC. >Verstehen muß ich das SFR-Register ADMUX mit seinen 8 Bit Beim ATTiny13 sind es nur 4 relevante Bits. Ansonsten sind sich die ADCs der AVRs sehr ähnlich. MfG Spess
@chris bei der Auflösung der FOR Schleife ist Dir ein Fehler unterlaufen. Nur die _delay Anweisung gehört zur Schleife Das PORTB = PORTB^1 soll nur einmal nach der Schleife laufen Gruß tom
Rolf H. schrieb: > o weia..Peter Dannegger, > ich als Assembler-Freak verstehe leider die C Sprache nicht. > > zu Kai....habe mir schon gedacht, daß man sich erst mal mit > "PWM" beschäftigen muß und dann mit dem analogen Teil weiter arbeiten > sollte. > > Hatte heute einen schweren Modellhubi-Absturz (mit Logo500) > das haut mich erstmal mit der Zeit zurück, aber ich bleibe am Ball. Das kenn ich, deswegen fliege ich nur noch meinen mcpx. Dem macht ein Sturz in die Wiese nix. Dann habe ich meinen Kopf für andere Sachen frei ;)
spess53 schrieb: > Hi > >>Das Ganze ist auf einen ATmega8 zugeschnitten und werde versuchen, >>dies auf einen Tiny13 oder 2313 umzubusseln. > > Der ATTiny2313 hat keinen ADC. > >>Verstehen muß ich das SFR-Register ADMUX mit seinen 8 Bit > > Beim ATTiny13 sind es nur 4 relevante Bits. Ansonsten sind sich die ADCs > der AVRs sehr ähnlich. > > MfG Spess Hallo Spess, danke für Deine Info. Stehe aber im Momment auf dem Schlauch! Der Tiny13 hat doch wie der 2313 auch keine Pins mit der Bezeichnung AGND AREF AVcc Giebt es keinen für nen 20 pol. Sockel? Für den Mega8 müßte ich mir eine neue Programmierkonsole mit 28 pol. Sockel erstellen. Hab hier noch den Tiny25 rumliegen, aber der hat auch nicht die Pins. Grüße Rolf
Rolf H. schrieb: > danke für Deine Info. > Stehe aber im Momment auf dem Schlauch! > Der Tiny13 hat doch wie der 2313 auch keine Pins mit der Bezeichnung > AGND AREF AVcc Na sei doch froh! Wieviele von den 8 Pins willst du denn noch für andere Dinge zweckgebunden haben? Im Datenblatt des Tiny steht wie der ADC zu benutzen ist. Dort schlägst du im Kapitel 'Analog to Digital Converter' nach. Das was dort drinnen steht, das gilt. Egal was Tutorials zu andern µC-Typen zu sagen haben. Die Tutorials kannst du, wenn sie für einen andern AVR-Typ als ungefährer Leitfaden nehmen, um dich mit der prinzpiellen Vorgehsensweise vertraut zu machen. Und dann sieht man eben im Datenblatt nach, was davon auf dem Tiny relevant ist und was nicht, was ein wenig anders gelöst ist und was gleich funktioniert. Du hast doch auch kein Problem damit, dass bei einem BMW die Kontrollen rund ums Lenkrad ein wenig anders angeordnet sind, als bei einem Passat. Und das es dann eben auch ein paar Dinge im Passat nicht gibt. Deswegen funktioniert das Grundprinzip fahren mit "Gangschaltung, Gas, Bremse und Kupplung" da wie dort auch nicht anders. > Hab hier noch den Tiny25 rumliegen, aber der hat auch nicht die Pins. Aber auch für den gibt es ein Datenblatt. Schau ins Inhaltsverzeichnis. Gibt es dort ein Kapitel über den "Analog to Digital Convert". Wenn ja, dann hat der auch einen ADC, der dokumentiert ist und den man verwenden kann. Wie genau, das steht exakt in diesem Kapitel.
Hi >Der Tiny13 hat doch wie der 2313 auch keine Pins mit der Bezeichnung >AGND AREF AVcc AGND und AVCC machen nur Sinn, wenn der Controller mehrere Ports hat und man die Versorgung des Analogteils vom Digitalteil trennen will. Die 8-pol. AVRs haben nur einen Port. Auf AREF kann man verzichten wenn man sich auf die interne Referenz und VCC als Referenzspannung beschränkt. >Hab hier noch den Tiny25 rumliegen, aber der hat auch nicht die Pins. Aber trotzdem einen ADC. In jedem AVR-Datenblatt steht auf der ersten Seite, welche IO-Module vorhanden sind. MfG Spess
Hallo Karl Heinz und Spess, ich bekomme vom googeln minimalen Durchblick beim Tiny13 (er hat also ADC0 bis ADC3) leider sind alle möglichen Cods in C geschrieben Und jetzt knöpfe ich mir das AVR-Tutorial ADC durch. kämpfe mich durch!
Ich empfehle, beim Programmieren immer das Datenblatt des jeweiligen AVR zu öffnen, da findet man sehr schnell alle Informationen zu der gewünschten Peripherie. Im Gegensatz zu vielen anderen Herstellern sind die AVR-Datenblätter vorbildlich. Besonders die ARM Datenblätter sind ein Graus, egal welcher Hersteller und Typ. Das einzige was Atmel gründlich mißglückt ist, ist die Beschreibung von T3 im ATmega164..1284 Datenblatt. T3 ist nur im ATmega1284/P vorhanden.
Rolf H. schrieb: > o weia..Peter Dannegger, > ich als Assembler-Freak verstehe leider die C Sprache nicht. Das tu mir leid, ich mache nichts mehr in Assembler. C hat den Charme, das es portabel ist und ich benutze auch verschiedene MC-Architekturen. Assembler wäre also unnütze Doppelarbeit. Du kannst natürlich AVR-Assembler Code zeigen, verlernt habe ich es ja nicht.
Hallo Leute, es geht mühselig voran, aber die ersten Bewegungen sind erkennbar. Habe mich intensiv mit den Register ADMUX beschäftigt und jetzt geht es mit ADCSRA weiter. Hier der erstellte Code...auf evtl. Fehler bitte um Antwort. ;Projekt: Projekttiny13 den 11.08.2013 ; Erklärung Register ADMUX: Bit6=REFS0|Bit5=ADLAR|Bit1=MUX1|Bit0=MUX0 ;MUX1 MUX0 = Kanalauswahl: ;0 0 = ADC0 (PB5/Pin1) ;0 1 = ADC1 (PB2/Pin7) ;1 0 = ADC2 (PB4/Pin3) ;1 1 = ADC3 (PB3/Pin2) wird im Code als Output verwendet! ;ADLAR: bestimmt die Ausrichtung des 10bit Ergebnisses in den Registern ADCH u. ADCL ; blicke noch nicht durch! ;REFS0: legt die Referenzspannung fest. ;0 = Vcc als Referenzspannung ;1 = interne " " ;Datei: adc01.asm ;AVR: Tiny13-20PU .include "tn13def.inc" rjmp Start .ORG OVF0addr ;Interrupt-Vektor .def akku=r16 Start: ; *** Initialisierungen *** ldi akku,0x08 ;0b0000 1000 out DDRB,akku ;PB3 = Output ;rote LED an PB3 = AUS cbi PORTB,PB3 ;REFS0 = 0 d.h. VCC is analog reference ;ADLAR = 1 d.h. Ergenbis ist Left Adjusted ;MUX1 = 1 d.h. gewählt ADC2 (PB4 Pin3 ldi akku, (1<<MUX1) | (1<<ADLAR) out ADMUX,akku ldi akku, (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0) out ADCSRA,akku ;muß ich noch ergründen! ; *** Hauptprogramm *** loop: rcall Convertieren rjmp loop Convertieren: sbi ADCSRA, ADSC ; Start conversion convert_adc_wait: sbic ADCSRA, ADSC ; Conversion ready ? rjmp convert_adc_wait in akku, ADCH ; Ergebnis in die Register r16 cpi akku, 150 brlo convert_led_an cbi PORTB, PB3 ; LED aus ret convert_led_an: sbi PORTB, PB3 ; LED an ret
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.