Attiny 13 Blink Schaltung mit einstellbarer Frequenz

Gast #3269346
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.
#3269819
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
#3269847
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
#3270358
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
Gast #3270546
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
}
#3272421
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
Gast #3272447
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
#3272485
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 ;)
#3273943
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
#3273964
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.
Gast #3273965
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
#3275386
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.
#3275393
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.
#3278396
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren