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