PWM mit Attiny2313 will nicht so ganz Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte
Autor |
PWM mit Attiny2313 will nicht so ganz Suche nach: pwm (3618) |
|
|
|
|
BID = 797250
ElektroNicki Inventar
Beiträge: 6429 Wohnort: Ugobangowangohousen
|
|
Hi!
Weiß jemand, warum Bascom bei diesem einfachen Programm den dritten PWM-Kanal nicht ansteuert?
Code : |
'###############################################################
'## Grundgerüst eines BASCOM- Programmes für Multi2313- Board ##
'###############################################################
'Den verwendeten Mikrocontroller nennen:
$regfile = "attiny2313.dat"
'Belegungsplan des Controllers:
'PA0 Lochrasterfeld
'PA1 Lochrasterfeld
'PA2 ISP/EXT Pin5
'PB0 ISP/EXT Pin3
'PB1 Lochrasterfeld
'PB2 Leistungsausgang (blau)
'PB3 Leistungsausgang (grün)
'PB4 Leistungsausgang (rot)
'PB5 ISP/EXT Pin1
'PB6 ISP/EXT Pin9
'PB7 ISP/EXT Pin7
'PD0 Lochrasterfeld
'PD1 Lochrasterfeld
'PD2 Lochrasterfeld
'PD3 Lochrasterfeld
'PD4 Lochrasterfeld
'PD5 ISP/EXT Pin4
'PD6 ISP/EXT Pin6
'Angeben mit welcher Frequenz der Mikrocontroller arbeitet:
$crystal = 8000000
'IOs einstellen:
'Config Portx.x = Input 'einzelner Pin als Eingang
'Config Portx = Output 'ein ganzer Port als Ausgang
'Namen für IOs festlegen:
'Pinname Alias Pinx.x
'Pullup- Widerstände für Eingänge einschalten:
'Pinname = 1
'Die Timer auf PWM-Modus stellen:
Config Timer0 = Pwm , Pwm = On , Prescale = 64 , Compare A Pwm = Clear Up ', Compare B Pwm = Clear Down
Config Timer1 = Pwm , Pwm = 8 , Prescale = 64 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down
'Diese PWM-Register haben eine Breite von 8 Bit - also Werte von 0 bis 255
'Wobei 0 = 0% Helligkeit und 255 = 100% Helligkeit bedeuten
'Config Portd.2 = Output
'Config Serialin = Buffered , Size = 10
'Timer freigeben:
Enable Timer1
Enable Timer0
'Timer starten:
Start Timer1
Start Timer0
'PWM-Register zuweisen:
Ledg Alias Pwm1a
Ledr Alias Pwm1b
Ledb Alias Pwm0a
'PWM-Register vorladen:
Ledr = 0
Ledg = 0
Ledb = 0
W 1
Ledr = 250
Wait 1
Ledg = 250
Wait 1
Ledb = 250
End
|
|
Grün und Blau funktionieren, nur Rot nicht
Ich hab irgendwo im Hinterkopf, dass es mit früheren Bascom-Versionen mitunter Probleme da gab... ich habe momentan 2.0.7.1
Der zuständige Pin ist übrigens hochohmig... hab schon nen anderen µC eingesetzt, gleiches Ergebnis.
_________________
[ Diese Nachricht wurde geändert von: ElektroNicki am 13 Nov 2011 1:22 ] |
|
BID = 797324
wulf Schreibmaschine
Beiträge: 2246 Wohnort: Bozen
|
|
Wo stellst du die benötigeten Anschlüsse auf Ausgang?
Alles was nach selbigem Aussehen könnte ist auskommentiert.
Offtopic :
| Es wird zwar langsam langweilig den Leuten C zu empfehlen, aber lass mich dem Ritual frönen: Benutze C! Dann kann man dir auch besser helfen. |
_________________
Simon
IW3BWH |
|
BID = 797328
ElektroNicki Inventar
Beiträge: 6429 Wohnort: Ugobangowangohousen
|
Ich habe das Problem mittlerweile umgangen...
Einfach nen anderen Pin genommen
Wieso auf Ausgang stellen, klappt ja an allen Pins bis auf einen^^
Allerdings hakt es jetzt bei der seriellen Kommunikation...
Die Hardware bis zum 2313 ist okay, auch eine LED direkt am RXD-Pin flackert...
Code : |
$crystal = 8000000
$baud = 1200
Config Timer0 = Pwm , Pwm = On , Prescale = 64 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up
Config Timer1 = Pwm , Pwm = 8 , Prescale = 64 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down
'Diese PWM-Register haben eine Breite von 8 Bit - also Werte von 0 bis 255
'Wobei 0 = 0% Helligkeit und 255 = 100% Helligkeit bedeuten
Config Pind.2 = Output
Config Pind.3 = Input
Enable Int1
Portd.2 = 0
Config Serialin = Buffered , Size = 10
'Timer freigeben:
Enable Timer1
Enable Timer0
'Timer starten:
Start Timer1
Start Timer0
'PWM-Register zuweisen:
Ledg Alias Pwm1a
Ledb Alias Pwm0a
Ledr Alias Pwm0b
'PWM-Register vorladen:
Ledr = 100
Ledg = 100
Ledb = 100
'Dim Wert As String * 4 'Die Variable wo der Eingelesene Wert vom UART reinkommt
'Dim Farbe(3) As String * 4 'Das Array mit den durch SPLIT einzelnen Farben
Dim Rot As Byte 'Die Farben als Integer wo die String rein sollen
Dim Gruen As Integer
Dim Blau As Integer
'Dim Bcount As Byte
Do
Input Rot 'Wert 'Hier wird der UART gelesen
'Bcount = Split(wert , Farbe(1) , " ") 'Hier wird der eingelesene String in 3 Teile nämlich R, G und B gesplittet
' Rot = Val(farbe(1)) 'Die Versuche einen String in ein Integer zu konvertieren
' Gruen = Val(farbe(2))
' Blau = Val(farbe(3))
Compare0b = Rot 'Die PWM Kanäle
Compare0a = Gruen
Compare1a = Blau
Loop
End
End |
|
_________________
[ Diese Nachricht wurde geändert von: ElektroNicki am 13 Nov 2011 15:40 ]
|
BID = 797330
ElektroNicki Inventar
Beiträge: 6429 Wohnort: Ugobangowangohousen
|
...
Config Pind.2 = Output
Config Pind.3 = Input
Enable Int1
Portd.2 = 0
'Timer freigeben:
Enable Timer1
Enable Timer0
'Timer starten:
Start Timer1
Start Timer0
'PWM-Register zuweisen:
Ledg Alias Pwm1a
Ledb Alias Pwm0a
Ledr Alias Pwm0b
'PWM-Register vorladen:
Ledr = 100
Ledg = 100
Ledb = 100
'Dim Wert As String * 4 'Die Variable wo der Eingelesene Wert vom UART reinkommt
'Dim Farbe(3) As String * 4 'Das Array mit den durch SPLIT einzelnen Farben
Dim Rot As Byte 'Die Farben als Integer wo die String rein sollen
Dim Gruen As Integer
Dim Blau As Integer
'Dim Bcount As Byte
Do
Inputbin Rot
Compare0b = Rot 'Die PWM Kanäle
Compare0a = Gruen
Compare1a = Blau
Loop
End
End[/code]
_________________
|
BID = 797361
caargoo Gerade angekommen
Beiträge: 16 Wohnort: Heiligenkreuz
|
Hallo!
[quote]
ElektroNicki schrieb am 2011-11-13 15:38 :
Ich habe das Problem mittlerweile umgangen...
Einfach nen anderen Pin genommen [quote]
...verstehe ich nicht! Pwm1b ist PB4. Wie kann man da einen anderen
Pin nehmen?
Schreib mal Compare B Pwm = Clear Up
Das Enable und Start Timer Zeugs ist nicht nötig!
MfG
caaargoo
|
BID = 797367
ElektroNicki Inventar
Beiträge: 6429 Wohnort: Ugobangowangohousen
|
Ich habe einen anderen PWM-Kanal verwendet, da der 2313 4 hat, ich für RGB aber nur 3 brauche
Das Problem ist mittlerweile erledigt, ich forsche momentan, wie ich ihm die Farbdaten seriell angedreht bekomme...
_________________
|
BID = 797460
ElektroNicki Inventar
Beiträge: 6429 Wohnort: Ugobangowangohousen
|
Der erste Fehler war, dass A und B vertauscht waren...
Jetzt trollt mich aber noch
Code : |
G = Waitkey()
Gn = Val(g)
Ledg = Gn |
|
g ist als String*3 und gn als Byte dimensioniert...
Leider verhackstückelt er nur das letzte Zeichen, d.h. ich kann mir nur nen Wert zwischen 0 und 9 aussuchen.
Bisschen schwach -.-
Weiß jemand Rat?
_________________
|
BID = 797478
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Waitkey blockiert solange, bis ein Zeichen hereinkommt und das wird dann von ASCII in eine Zahl umgewandelt.
Was du brauchst ist aber die Umwandlung eines Strings der Form "e" oder "ze" oder "hze" in eine Ganzzahl. Da musst du dir was anderes ausdenken, z.B. solange Zeichen lesen, bis ein Enter am Rechner gedrückt wird und dann die Zahl berechnen:
Dim s As String * 5
Dim i as Integer
Dim r as Byte
While i < 5
Do
r = Waitkey()
if r = Asc(13) Or r = Asc(10)) Then Break
Mid(s, i, 1) = r
i = i + 1
Loop
Ist jetzt Pseudocode, passt ja auch zur Pseudo-Programmiersprache
Also, man wartet hier solange, bis ein Newline oder Carriage Return empfange wurde oder der Zähler i größer als 5 wird, dann sind wir nämlich am Ende der Stringgröße angekommen. Mid() schreibt das angekommene Zeichen in den Pufferstring.
Danach kann man diesen String auswerten.
P.S.:
Unter C würde man atoi nehmen, die Funktion berechnet aus einer ASCII-Zeichenkette den Ganzzahlwert.
Auf AVRs lasse ich immer eine Art Minishell laufen, die Befehle über die UART oder auch UDP oder TCP entgegennimmt. Ein kleiner Parser erzeugt aus einer vollständig gelesenen Zeile dann die typische argc-/argv-Struktur, die man aus der C-Programmierung kennt.
argc enthält die Anzahl der Elemente in der Zeile, argv ist ein Vektor, dessen Indizes auf die jeweiligen Argumente zeigen, Beispielaufruf:
> eeprom write 0x0f00 Hallo_Welt 6
Nachdem der Parser, der noch Whitespaces etc. rausschmeißt, drübergelaufen ist erhält man folgende Struktur:
argc = 5
argv[0] = "eeprom"
argv[1] = "write"
argv[2] = "0x0f00"
argv[3] = "Hallo_Welt"
argv[4] = "6"
Das kann man dann Unterprogrammen mitgeben. C ist schon toll ...
_________________
|
BID = 797514
ElektroNicki Inventar
Beiträge: 6429 Wohnort: Ugobangowangohousen
|
Danke für deine Mühe; ich stelle gerade fest, dass es ein Fehler ist, aufgrund von zu hoher Motivation spätabends noch Programmieren zu wollen.
Hab mich jetzt mal halbwegs ausgeschlafen drangesetzt und plötzlich kam mir die Erleuchtung:
Wobei Gn einfach ein Byte ist
So, jetzt habe ich auch mehr Speicher frei
Wollte zuerst mit ASCIIs arbeiten, da die in jedem Terminalemulator lesbar sind, aber hterm ist was das angeht ja eh ne eierlegende Wollmilchsau und kann ASCII, Hex, Dec und Bin senden und empfangen
Dann kommt noch ne Prüfsumme dran und fertig ist die Laube
EDIT:
Diesen Parser gibt es afaik auch bei Bascom
_________________
[ Diese Nachricht wurde geändert von: ElektroNicki am 14 Nov 2011 11:14 ]
|
BID = 797561
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Ja, aber meiner ist flexibler...
Wenn nur ein Standardterminal verfügbar ist (Hyperterminal, GtkTerm, Putty, Minicom, ...) hast du aber ein Problem mit deinen Binärdaten.
Ich habe auch längere Zeit Daten rein binär übertragen und in Frames verpackt, die man in C schön mit structs abbilden kann.
Wenn dabei die Geschwindigkeit oder eine konstante Bitrate nicht so wichtig sind, würde ich immer den Umweg über ASCII gehen.
Ist aber auch eher eine Erfahrung aus der Praxis .
_________________
|
BID = 797621
ElektroNicki Inventar
Beiträge: 6429 Wohnort: Ugobangowangohousen
|
Ich werde es wohl doch mit "Split" anstellen.
Wenn ich den Speicherbedarf (im Programm, das ich momentan umstricke, ist sehr viel Platz für die Variablen reserviert...) reduziert bekomme, ist das doch die übersichtlichere Lösung:
Ich teile der Funktion nen Startwert ("Jetzt gehts los") mit, ein Trennzeichen und das Array, in das die einzelnen Werte gesteckt werden sollen.
Dann wird mit Val ein Dezimalwert draus und ab gehts ins OCR
Edit:
Mama, der Compiler trollt mich, sag ihm, er soll aufhören!
Code : |
Dim Wert As String * 12 'Die Variable wo der Eingelesene Wert vom UART reinkommt
Dim Farbe(3) As String * 12 'Das Array mit den durch SPLIT einzelnen Farben
Dim Bcount As Byte
Do
Input "" , Wert 'Hier wird der UART gelesen
Bcount = Split(wert , Farbe(1) , " ") 'Hier wird der eingelesene String in 3 Teile nämlich R, G und B gesplittet
Pwm0b = Val(farbe(1)) 'Die Versuche einen String in ein Integer zu konvertieren
Pwm1a = Val(farbe(2))
Pwm0a = Val(farbe(3))
Loop
End |
|
Das kann doch nicht sein, dass der 2313 damit schon überlastet ist???
Ich habe schon die Variablen für die einzelnen Kanäle rausgenommen und lasse die Daten direkt ins OCR wandern...
Seltsam
Ob man da mit Stacksize etc. noch herumspielen kann?
Subroutinen gibts in diesem Programm nicht.
_________________
[ Diese Nachricht wurde geändert von: ElektroNicki am 14 Nov 2011 20:37 ]
[ Diese Nachricht wurde geändert von: ElektroNicki am 14 Nov 2011 20:40 ]
|
BID = 797646
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Der Tiny hat 128 Byte SRAM.
Du besorgst dir ja auf jeden Fall statisch schonmal 4·12 = 48 Byte Speicher...
Dann ist da noch der Stack, der von Adresse 0x7f nach unten klettert. Im Stack werden die meisten lokalen Variablen gehalten, wenn sie in keinem Register Platz haben oder statisch sind.
Außerdem ist deine Uart gepuffert und das verbraucht dann ebenfalls Speicher...
Ich sage es nochmals: BASCOM ist vielleicht nett von der Arbeitserleichterung her, aber ansonsten reiner Murks (es sei denn, man nutzt größere µCs, dann wirds auch in der Industrie noch benutzt).
Allein die Unterscheidung zwischen String und 8-Bit-Integern ist blödsinnig.
Ansonsten ist dein Vorgehen richtig.
_________________
|
BID = 797669
ElektroNicki Inventar
Beiträge: 6429 Wohnort: Ugobangowangohousen
|
Okay, dann stricke ich es doch auf Binärmodus um...
Dann habe ich, wenn ich mich nicht verrechnet habe, nur 4 Byte pro Quasipaket.
Je eins für jeden Kanal und dann noch ne Prüfsumme.
Stimmt die nicht, werfe ich das Paket einfach weg.
Dann muss ich auch nicht irgendwelche Klimmzüge zur Erkennung des Paketanfangs machen und ich habe mehr Buszeit frei (was mir später evtl. noch die Beine brechen könnte )
_________________
|
BID = 798078
ElektroNicki Inventar
Beiträge: 6429 Wohnort: Ugobangowangohousen
|
Jetzt habe ich einfach nur ein Brett vor dem Kopf...
Code : |
$regfile = "attiny2313.dat"
$lib "Mcsbyte.lbx"
$crystal = 8000000
$baud = 9600
Config Timer0 = Pwm , Pwm = On , Prescale = 64 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Up
Config Timer1 = Pwm , Pwm = 8 , Prescale = 64 , Compare A Pwm = Clear Up , Compare B Pwm = Clear Down
Config Portd.2 = Output
Portd.2 = 0
Ledg Alias Pwm1a
Ledb Alias Pwm0a
Ledr Alias Pwm0b
' Ledr = 0
' Ledg = 0
'Ledb = 0
Dim Lr As Byte
Dim Lg As Byte
Dim Lb As Byte
Dim Wert As String * 4
Dim R As String * 1
Dim G As String * 1
Dim B As String * 1
Dim Crc As String * 1
Dim Crcb As Byte
Do
Inputbin Wert
Crc = Right(wert , 1)
Crcb = Val(crc)
If Crc8(wert , 3) = Crcb Then
R = Left(wert , 1)
G = Mid(wert , 2 , 1)
B = Mid(wert , 3 , 1)
Lr = Val(r)
Lg = Val(g)
Lb = Val(b)
Ledr = Lr
Ledg = Lg
Ledb = Lb
End If
Loop
End |
|
Irgendwie funktioniert es nicht...
Weiß jemand, wo der Fehler liegt?
_________________
|
BID = 798081
DonComi Inventar
Beiträge: 8605 Wohnort: Amerika
|
Naja, dann musst du selbst nochmals überlegen, du entwickelst ja die Komfortelektronik .
Kleiner Scherz.
Aber hier sieht man, wie abgrundtief hässlich BASIC ist.
Und solange du hier nur den Kode reinknallst und nicht mal eine kleine Beschreibung lieferst, was denn genau nicht funktioniert, macht hier glaube ich keiner was .
_________________
|
|
Zum Ersatzteileshop
Bezeichnungen von Produkten, Abbildungen und Logos , die in diesem Forum oder im Shop verwendet werden, sind Eigentum des entsprechenden Herstellers oder Besitzers. Diese dienen lediglich zur Identifikation!
Impressum
Datenschutz
Copyright © Baldur Brock Fernsehtechnik und Versand Ersatzteile in Heilbronn Deutschland
gerechnet auf die letzten 30 Tage haben wir 20 Beiträge im Durchschnitt pro Tag heute wurden bisher 0 Beiträge verfasst © x sparkkelsputz Besucher : 182393520 Heute : 716 Gestern : 7548 Online : 550 25.11.2024 6:39 1 Besucher in den letzten 60 Sekunden alle 60.00 Sekunden ein neuer Besucher ---- logout ----viewtopic ---- logout ----
|
xcvb
ycvb
0.0863871574402
|