pwm auf tiny26 - hilfääää

Gast #67106
Lesenswert?

hi,

hat schon mal wer ein pwm-signal (so richtig mit timer1) aus einem
tiny26 gekriegt?
problem: soll in fastavr oder bascom gehen, assembler kann ich nicht.
oder hat jemand eine ganz winzige (wenn's sowas in assembler gibt)
routine, die ein pwm erzeugt, was man in basic-code einbinden kann?
soll aber wirklich schon gelaufen sein, der theoretische code in bascom
und fastavr funzt schon fehlerfrei, kommt nur kein signal aus den avr.
danke schon mal 4help, gruss, harry
Gast #67109
Lesenswert?

hi dirk,

den pinB.3 hab ich schon als output gesetzt.
trotzdem tut sich nix.
hast du schon mal aus 'nem tiny26 das pwm signal rausgekriegt?
mit bascom oder fastavr???
auf anderen controllern geht's ja, hängt also irgendwie mit dem tiny
zusammen.
gesucht hab ich auch, zu pwm und avr's find ich 'ne menge, aber nicht
zu pwm mit tiny26 mit bascom oder fastavr.
nicht mal mark alberts hat 'nen code der funktioniert, auf meine mail

... pwm1b = 100... kam: try to use ocr1b. tut aber ebensowenig.
also bitte keine theorien, echter, funktionierender tip wäre die
rettung. code wäre nett.

bis neulich denn, harry
Gast #500783
Lesenswert?

Darum ist es besser mit Assembler anzufangen. Damit lernt man erst mal 
die Hardware kennen und stochert nachher nicht im Trüben.
Du musst im Register TCCR1A das Bit OC1A deinen Wünschen entsprechend 
setzen, um den Portpin mit dem PWM zu steuern.
Dann den Prescaler auf die gewünscht Frequenz einstellen und den 
gewünschten PWM-Modus einstellen.
Gast #500954
Lesenswert?

Lothar Sammel wrote:
> das wäre toll ich kämpfe auch schon seit stunden mit timeeer1
> timer0 geht aber für 20ms mit H1ms-2ms (servo) gibts nur
> 20zwischenstufen
> ich bräuchte aber volle 255
>
> deswegen timer1 und der will nicht

Was soll an Timer1 anders sein, als an Timer0??!??
Wir sprechen schon noch / immer noch vom Tiny26, oder?

Wolln wir jetzt das Thema auf 5 oder 6 Threads verteilen?
Dann mach ich auch noch einen auf. gähn

Ich habe mal in anderen Foren den Begriff "SUFU!" gelesen und konnte bis 
dato nichts mit anfangen. Jetzt schon...

Sorry

/XlR.
Gast #507257
Lesenswert?

Moin,
Bei Bascom siehts so aus:

'PWM Test für Attiny26
'Je eine LED + Vorwiderstand von Pin B0-3 nach masse.

$regfile = "At26def.dat"
$crystal = 1000000

Dim A As Byte

Tccr1a = &B10100011                                         'Manuelle 
Konfiguration von OC1a
Tccr1b = &B10000101                                         'Manuelle 
Konfiguration von OC1b
Ocr1c = 255                                                 'Top Limmit

Config Pinb.0 = Output                                      'Port b.0 
als Ausgang
Config Pinb.1 = Output                                      'Port b.1 
als Ausgang
Config Pinb.2 = Output                                      'Port b.2 
als Ausgang
Config Pinb.3 = Output                                      'Port b.3 
als Ausgang

Do
Gosub Pwm
Loop

Pwm:
 For A = 0 To 255
  Ocr1a = A
  Ocr1b = A
  Waitms 2
 Next
Return

End
Gast #507281
Lesenswert?

Hi Hi,
Bsp: ich will PWM nur am PinB1, der invertierende PinB0/ bleibt als I/O 
geschaltet.
Mit OCR1C kann man die Timer Auflösung einstellen.
Mit OCR1A die Pulsebreite.
 Achtung der OCR1A darf nicht größer wie OCR1C sein!!

Viel Spaß noch.

.include "tn26def.inc"

.device Attiny26
          .org  $0000
     rjmp  Reset

    .def  temp      =r16
    .def  temp2      =r19

; I/O Pins
    .equ  PWM_out =1


Reset:


; Stackpointer bis 265 Byte initialisieren
    ldi   temp, RAMEND
    out   SP,  temp

;I/O Initialisierung

    ldi    temp, 1<<PWM_out
    out    DDRB, temp


;Timer Initialisierung

    ldi    temp, 
(1<<COM1A1)|(1<<COM1A0)|(0<<COM1B1)|(0<<COM1B0)|(0<<FOC1A)|(0<<FOC1B)|(1 
<<PWM1A)|(0<<PWM1B)
    out    TCCR1A, temp
    ldi    temp, 
(1<<CTC1)|(0<<PSR1)|(1<<CS13)|(1<<CS12)|(0<<CS11)|(0<<CS10)
    out    TCCR1B, temp

    ldi    temp, 255
    out    OCR1C, temp

    ldi    temp, 64
    out    OCR1A, temp

Programm:
nop
rjmp  Programm
Angehängte Dateien:
Gast #507303
Lesenswert?

Hi Lothar,
ich hab mal deine Werte angeschaut kein Wunder dass es nicht geht. 
Versuch es
 mal mit:

tccr1a=18

tccr1b=135
ocr1b= von 0 bis 255
ocr1c=255

Alles Dezimal versteht sich.
Viel erfolg noch.
#507424
Lesenswert?

danke der code funzt jetzt mal

'/////////////////////////////////////////////////////////
'///  BASCOM ISP PROGRAMMER TEST timer1                ///
'///   toggle portb.3   ///                            ///
'/////////////////////////////////////////////////////////
$regfile = "AT26def.dat"                                    ' used 
device
$crystal = 8000000
$hwstack = 32                                      ' default use 32
$swstack = 10                                      'default use 10 for
$framesize = 40                                       'default use 40 
for
Config Portb = Output
Led Alias Portb.0
Tccr1a = 17                                'toggle ocr1b in pwm mode
Tccr1b = 135      'clock PRESCALE 64  ctc1 an relod nach compare b/c
Ocr1b = 125                              'vorlasen servo mitte
Ocr1c = 255                             'compare zahl
Enable Interrupts
Do
Wait 2                                                      ''
Toggle Led
Ocr1b = 192                '0,5ms servo links
Wait 2
Toggle Led
Ocr1b = 63          '1,5ms servo rechts
Loop

End                  'pulsbreite 2ms

ABER ICH WILL JA MEHR

es sollen die vollen 255 des timers1 8bit zur servosteuerung genutzt 
werden

sinn ist ADC 10bit durch 4 an servo auszugeben
ABER RICHTIG nicht nur 20schritte

deswehen  wie geht das
  puls high soll aus 2timer läufen bestehen
puls low aus 10 timerläufen a 250
255 ist 2.03ms

ist das als isr überhaupt machbar

danke
Gast #507678
Lesenswert?

Hallo Lothar ,

;  puls high soll aus 2timer läufen bestehen
puls low aus 10 timerläufen a 250
255 ist 2.03ms

Das kann der Timer in PWM- Modus nicht wirklich, aber du kannst ja den 
Timer in CTC laufen lassen, und jedes Mal wenn er überläuft kannste 
einen Timer Overflow IRQ
ausführen(ISR) lassen, wo dann der Pin Zustand verändert wird.


Dein Clock beträgt 8MHz
Der Prescaler steht auf 64.
Timerfrequenz= 8MHz/64=125KHz ~8µS/cycle

->Pulse high soll aus 2timer Läufen bestehen
-> puls low aus 10 Timer läufen a 250 = 10x250x8µS=20mS

Ich habe das ganze in ASM nachgebaut und erhalte eine Minimale puls Zeit 
von: 30µS
Und Maximale Puls Zeit von: 3,9mS.
Die Pause beträgt ca. 20mS.

3,9mS/256~ 15µS Schritt.

Wie ich feststellen musste sprichst du eine andere Sprache(irgendein 
Basic?), bei mir is es only ASM.
Wenn’s dich trotzdem interessiert, dann kann ich dir mein PAP oder auch 
den Quellcode bereitstellen.

Mit freundlichen Grüßen
Alex
#507691
Lesenswert?

> sinn ist ADC 10bit durch 4 an servo auszugeben
> ABER RICHTIG nicht nur 20schritte

Servoimpulse sind aus Sicht des Mikrocontrollers so schnarchlangsam, 
dass man die nicht mit Hardware-PWM machen muss. Hier ist ein Beispiel 
mit dem Mega48 (1MHz-intern), der 6 (7) Servoimpulse in Abhängigkeit von 
6 Potis und 4 Tastern erzeugt. Der Mega48 verbringt die meiste Zeit im 
Sleep-Mode, die Impulse haben eine Auflösung von 1µs, also eine 
Differenz von 1024 Schritten zwischen beiden Endlagen. Das Schalten der 
7 Impulsausgänge geschieht in der Timer-ISR. Das Programm lässt sich 
(wenn man es verstanden hat) leicht an andere Bedingungen und Aufgaben 
anpassen.
http://www.hanneslux.de/avr/mobau/7ksend/7ksend02.html

...
#507769
Lesenswert?

Hannes, hast du schon mal überlegt, deine Programme in Bascom zu 
schreiben?
Das würde das "Gejammere" verhindern, was auftritt, nachdem man sich 
deine Seite angeguckt hat, und festgestellt hat, dass das alles in Asm 
programmiert ist... ;-)
Vor allem, weil Bascom ja schon eine Servo-Funktion mitliefert...
#507868
Lesenswert?

@rahul

das ist ja das problem bei bascom hab ich gerade mal 50-100 positionen 
des servos
die ich mit 1024 analogwerten synkronisieren kann is nicht gerade toll 
mit dem µC

mit einen hc4001BF bekommme ich über poti immerhin annalog 220 hin is 
halt analog
deswegen die diskusion um ein Prezidensfall programm für die timer 8bit

danke erst mal für die vielen tollen antworten
#507881
Lesenswert?

Wenn du wirklich die 1024 möglichen Werte des ADC für die Ansteuerung 
eines Servos benutzen willst, dann wird das ein "mächtig gewaltiges" 
Gezitter (Vermutung meinerseits).

Gut, wie baut man sich einen Impuls zwischen 1 und 2ms mit einem 
8Bit-Timer?
Entweder verschenkt man einen Teil der 8Bit dafür, mit dem Timer das 
Offset von 1ms zu erzeugen, oder man erweitert den 8Bit Timer um ein 
weiteres Byte und baut sich einen 16Bit Timer.
Erste Variante hast du ja schon durch...(und für nicht sinnvoll 
befunden).
Zweite Variante:
Baue dir mit einem Timer eine Zeitbasis, mit der du 1ms, 2ms und 254 
oder mehr Zwischenschritte erzeugen kannst.
Dann startest du den Timer und schaltest den Ausgang an.
In der ISR zählst eine Variable herunter.
Ist diese gleich 0, schaltest du den Ausgang wieder aus...
#507960
Lesenswert?

Rahul Der trollige wrote:
> Hannes, hast du schon mal überlegt, deine Programme in Bascom zu
> schreiben?

Warum sollte ich das tun?
Warum sollte ich um zusätzliche Ecken denken müssen?
In Assembler kann ich dem Controller ohne Umwege exakt sagen, was er 
machen soll und wie er es machen soll. Und er macht es sogar!
In BASCOM müsste ich zusätzlich um die Ecke denken. Dazu bin ich zu faul 
und zu doof.

> Das würde das "Gejammere" verhindern, was auftritt, nachdem man sich
> deine Seite angeguckt hat, und festgestellt hat, dass das alles in Asm
> programmiert ist... ;-)

Das ist aber keine Frage der Programmiersprache, sondern des 
Programmierstils. Wer Zeiten mit WAITMS erzeugt, wird keine effizienten 
Programme schreiben. Das (schlechte Programme schreiben) geht auch in 
ASM, dazu braucht man kein BASCOM.

Dass man in BASCOM auch vernünftig programmieren kann, wenn man sich die 
verwendete Hardware genauer ansieht, hat Paul Baumann kürzlich gezeigt.

> Vor allem, weil Bascom ja schon eine Servo-Funktion mitliefert...

Naja, ob die mehr als ein Servo unterstützt? Ich würde dem Frieden nicht 
trauen...

...
#507963
Lesenswert?

>Dazu bin ich zu faul und zu doof.
Faul bin ich auch, doof würde ich als Attribut für dich nie gelten 
lassen.


>Dass man in BASCOM auch vernünftig programmieren kann, wenn man sich die
>verwendete Hardware genauer ansieht, hat Paul Baumann kürzlich gezeigt.

Nicht nur Paule. Die Leute, die programmieren können, jammern hier in 
der Regel auch nicht rum...
#507966
Lesenswert?

Aber wenn alle sehr gut programieren könnten, gäbe es hier auch keine 
Fragen und wenig Hilfe, oder ?

Und man muss auch nicht gut programmieren können, um mit 
Softwarelösungen Geld zu verdienen (M$) :o) Oft reicht auch eine kleine, 
schlecht programmierte, aber gut laufende µC-Lösung vollkommen aus.
#507973
Lesenswert?

>Und man muss auch nicht gut programmieren können, um mit
>Softwarelösungen Geld zu verdienen (M$) :o)

Sehr schlechtes Beispiel.

>Oft reicht auch eine kleine, schlecht programmierte, aber gut laufende µC->Lösung 
vollkommen aus.

Vor allem auf dem medizinischen oder raumfahrttechnischen Sektor...

>Aber wenn alle sehr gut programieren könnten, gäbe es hier auch keine
>Fragen und wenig Hilfe, oder ?
ja, klar...
Es gibt aber auch Leute, die gegen Hilfe resistent sind...
Gast #509185
Lesenswert?

 @Rahul Der trollige
Eier meiner lieblings Sprüche," Wer viel misst, misst Mist." oder auch
" Wer mit Mist  misst, der misst Mist.
Anleitung:
1) Pll aktivieren. Fuse setzen
2) Timer ClockSource auf PLL umstellen
3) Timer1 , Prescaler /1 CTC=1
4) im OCR1C=0 eintragen
5) OSCCAL auf $FF hochjagen.

6) und wenn die Mühle schwingt dann schwingt sie richtg.
Aus meinen erkentnissen sollte die PLL auf der doppelten Frequenz 
schwingen,
im Anhang der Source.
In wie fern das sinnvoll ist weis ich nicht.
MFG
Alex
Angehängte Dateien:

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