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.
danmke dann werde ich das gleich mal testen wenn ich zuhause bin hoffentlich funzt das dann besser als bei meinen versuchen
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...
schau mal in den anhang, ich habe eine pwm steuerung mit dem 26 gebaut, geht prima. wenn du fragen hast, sag bescheid :)
@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
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
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
@Alex: Ein Tiny26, der mit 56,18MHz schwingt... interessant. Wer viel misst, misst Mist.
@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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.