Forum: Mikrocontroller und Digitale Elektronik Attiny 13 Blink Schaltung mit einstellbarer Frequenz


von Sesam (Gast)


Lesenswert?

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

von gonzo (Gast)


Lesenswert?

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.

von Sesam (Gast)


Lesenswert?

Also ich strebe eine lineare Regelung an.

Nur wie realisier ich die?

von Karl H. (kbuchegg)


Lesenswert?


von Tick-Tack (Gast)


Lesenswert?

Um eine Kennlinie (außer linear) zu implementieren ist das Stichwort 
"Look-up-Table" noch ganz hilfreich...

Aber Du willst ja eine lineare.

von Rolf H. (flash01)


Lesenswert?

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

von Kai S. (kai1986)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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
}

von Rolf H. (flash01)


Lesenswert?

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

von chris (Gast)


Lesenswert?

>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
}

von chris (Gast)


Lesenswert?

.... upps ... in der Schleife fehlt noch

zaehler=zaheler-1;

von Rolf H. (flash01)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

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

von tom (Gast)


Lesenswert?

@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

von Jörg E. (jackfritt)


Lesenswert?

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 ;)

von Rolf H. (flash01)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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.

von spess53 (Gast)


Lesenswert?

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

von Rolf H. (flash01)


Lesenswert?

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!

von Peter D. (peda)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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.

von Rolf H. (flash01)


Lesenswert?

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
Noch kein Account? Hier anmelden.