PWM mit Attiny2313 will nicht so ganz

Im Unterforum Microcontroller - Beschreibung: Hardware - Software - Ideen - Projekte

Elektronik Forum Nicht eingeloggt       Einloggen       Registrieren




[Registrieren]      --     [FAQ]      --     [ Einen Link auf Ihrer Homepage zum Forum]      --     [ Themen kostenlos per RSS in ihre Homepage einbauen]      --     [Einloggen]

Suchen


Serverzeit: 29 11 2024  01:32:49      TV   VCR Aufnahme   TFT   CRT-Monitor   Netzteile   LED-FAQ   Osziloskop-Schirmbilder            


Elektronik- und Elektroforum Forum Index   >>   Microcontroller        Microcontroller : Hardware - Software - Ideen - Projekte

Gehe zu Seite ( 1 | 2 Nächste Seite )      


Autor
PWM mit Attiny2313 will nicht so ganz
Suche nach: pwm (3619)

    







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:


Code :

 Gn = Waitkey()

Ledg = Gn


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 .

_________________


      Nächste Seite
Gehe zu Seite ( 1 | 2 Nächste Seite )
Zurück zur Seite 0 im Unterforum          Vorheriges Thema Nächstes Thema 


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 19 Beiträge im Durchschnitt pro Tag       heute wurden bisher 0 Beiträge verfasst
© x sparkkelsputz        Besucher : 182421163   Heute : 202    Gestern : 5459    Online : 504        29.11.2024    1:32
0 Besucher in den letzten 60 Sekunden         ---- logout ----viewtopic ---- logout ----
xcvb ycvb
0.0891990661621