Forum: Mikrocontroller und Digitale Elektronik pwm auf tiny26 - hilfääää


von harry (Gast)


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

von A. Arndt (Gast)


Lesenswert?

Hallo,

wo liegt das Problem ? Mail doch mal Dein Listing von FASTAVR.

Wichtig ist natürlich, dass die Pins B0 bis B3 abgegriffen werden.

Gruss
A. Arndt

von Dirk (Gast)


Lesenswert?

Hi,

dein Problem ist das du den PWM PIN in Bascom als Output setzen musst!


Bitte nutze das naechste mal die Suchfunktion den dieses Thema war hier
schon ein paar mal.


Mfg

Dirk

von harry (Gast)


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

von Lothar S. (magic33)


Lesenswert?

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


von Sonic (Gast)


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.

von Axel R. (Gast)


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.

von Lothar S. (magic33)


Lesenswert?

das problem scheint wirklich nur bei dem chip zu sein

ich kämpfe schon seit wochen damit

und bekomme nur die 2ms up und 2ms down egal was ich einstelle

da tut sonst nix

tccr1a=16
tccr1b=7

ocr1b= von 0 bis 255

ocr1c=255

timsk=3


plccr=0


nix tut

von Bernd (Gast)


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

von Alex M. (Gast)


Angehängte Dateien:

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

von Alex M. (Gast)


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.

von Lothar S. (magic33)


Lesenswert?

danmke dann werde ich das gleich mal testen wenn ich zuhause bin

hoffentlich funzt das dann besser als bei meinen versuchen

von Alex M. (Gast)


Lesenswert?

Sry Lothar,
ich hab übersehen dass du am PinB2,3 dein Signal abgreifst.
Dann solltest du
tccr1a=18 durch tccr1a=17 ersetzen, der Rest bleibt wie oben 
beschrieben.
MFG
Alex

von Lothar S. (magic33)


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

von Alex M. (Gast)


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

von Hannes L. (hannes)


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

...

von Rahul D. (rahul)


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

von Alex G. (alexgrah)


Angehängte Dateien:

Lesenswert?

schau mal in den anhang, ich habe eine pwm steuerung mit dem 26 gebaut, 
geht prima. wenn du fragen hast, sag bescheid :)

von Lothar S. (magic33)


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

von Rahul D. (rahul)


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

von Hannes L. (hannes)


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

...

von Rahul D. (rahul)


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

von Alex G. (alexgrah)


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.

von Rahul D. (rahul)


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

von Hannes L. (hannes)


Lesenswert?

Rahul Der trollige wrote u.a.:
> Nicht nur Paule. Die Leute, die programmieren können, jammern hier in
> der Regel auch nicht rum...

Das ist wohl wahr. Daher fallen sie auch nicht auf und verderben die 
Statistik... ;-)

...

von Lothar S. (magic33)


Lesenswert?

ich gebs jetzt auf

servoroooutine von bascom direkt
und ausen dann 16mhz ann sind wenigstens so 200werte machbar
interne 8mhz bringen max 140 brauchbare werte an das servo

analog ist in diesem falle wohl das beste 50kohm auf HC4001

danke an die helfer

von Werbungverschmäher (Gast)


Lesenswert?

Der Tiny26 kann auch intern mit 16MHz klappern. Stelle ihn auf 1MHz und 
schalte die PLL ein, dann klappert er ohne externen Taktgeber mit 16MHz.

MFG

von Alex M. (Gast)


Angehängte Dateien:

Lesenswert?

Das mit der Pll ist eine lustige sache siehe Anhang  :-)
Die Frequenz wird am Pin B1 gemessen.

Ich weis auch nicht wozu das gut sein soll?
MFG

von Rahul D. (rahul)


Lesenswert?

>ich gebs jetzt auf
no comment...

von Rahul D. (rahul)


Lesenswert?

@Alex: Ein Tiny26, der mit 56,18MHz schwingt... interessant.
Wer viel misst, misst Mist.

von Alex M. (Gast)


Angehängte Dateien:

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

von Lothar S. (magic33)


Lesenswert?

ne mit extern 16mhz is das voll ok bin nun mit der bascom servo routine 
zufrieden 210 schritte bei ist ok die aplikation läuft und das is ok
"kunde" zufrieden ist noch besser und das ist dann für mich hier das 
ende


von Werbungverschmäher (Gast)


Lesenswert?

Lothar, kauf Dir bitte mal 'ne Tüte Deutsch, Dein Gestammel ist 
unverständlich.

MfG

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.