PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Stern-Dreieckschaltung mit Atmega8 (erstwerk)



bigeggmc
07.03.2006, 21:41
Guten abend,
ich bin neu hier und durch nen lehrgang dazu gekommen mich mehr mit microcontrollern zu befassen.
nun hab ich mir die experimentierplatform von myavr besorgt.
da ich leider zu geizig bin mir dazu auch noch die software und die bücher zu kaufen bin ich nun dazu übergegangen mir die sachen aus dem internet (google) zu holen, bzw mir das damit bei zu bringen.
da ich mir das ja nun alles er surft hab, aber das prog doch selber geschrieben (man will ja ned klauen) hab, möcht ich gern mal von den profis wissen wie es mir gelungen ist?

hier also das prog zu einer stern-dreieckschaltung für nen starkstrommotor,
meins ist die deluxe version mit zustandsanzeige auf nem lcd 8-[


$regfile = "m8def.dat"
$crystal = 3686400



Config Lcd = 16 * 2
Config Lcdpin = Pin , Rs = Portd.2 , E = Portd.3 , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 'Belegung am MEGA8
Config Lcdbus = 4
Config Lcdmode = Port
Config Portd = Output
Config Portb = Output
Config Portc.0 = Output
Config Portc.1 = Output
Config Portc.2 = Output
Config Portc.4 = Input
Config Portc.5 = Input

Portc.5 = 1
Portc.4 = 1

Cls

Do

If Pinc.4 = 0 Then 'verzögerung bei einschalten der hintergrundbeleuchtung vom display (dämmerungsschalter)
Waitms 250
If Pinc.4 = 0 Then Portb.1 = 1
End If

If Pinc.4 = 1 Then 'verzögerung beim ausschalten der hintergrundbeleuchtung vom display (dämmerungsschalter)
Waitms 250
Portb.1 = 0
End If

If Pinc.5 = 0 Then
Waitms 250
If Pinc.5 = 0 Then Locate 1 , 1
Lcd "Start Motor in"
Locate 2 , 1
Lcd "Sternschaltung"
Goto 1

1:
Portc.2 = 1 'motorhauptschütz an
Portc.1 = 1 'schütz für sternschaltung
Wait 4

Cls
Locate 1 , 1
Lcd "Umschalten"
Locate 2 , 1
Lcd "in Dreieck"



Portc.2 = 1 'motorhauptschütz an
Portc.1 = 0 'schütz für sternschaltung aus um kurzschluss zu vermeiden 500 ms verzögerung bis
'einschalten von schütz für dreieckschaltung
Wait 1
Cls
Locate 1 , 1
Lcd "Motor Laeuft in"
Locate 2 , 1
Lcd "Dreieckschaltung"

Waitms 500
Portc.0 = 1

Wait 10
display off

If Portc.0 = 1 Then Stop 'verriegelung gegen wiederstart des programms mit pinc.5

End If

Loop

End


nun ja, bascom sacht das prog funz, mein board auch ;) also was sacht ihr dazu und wie kann ich was noch verbessern?

Torsten_G
07.03.2006, 23:06
Statt der "Config"-Orgie für den Port C kannst Du auch direkt ins entsprechende DDR-Register schreiben:

Ddrc=&B00000111

Numerische Sprungmarken (Goto 1) sind zumindest ungewöhnlich - man findet sie relativ schwer im Zahlenwirrwar. Aber das ist natürlich Geschmackssache.

"Wait"-Befehle sind letztendlich nur bei sehr klar umrissenen Aufgaben oder einfachen Schritt-Abläufen zu gebrauchen, wo es überdies nicht auf hohe Genauigkeit der Zeiten ankommt.

Du musst bedenken, der Prozessor macht bei "Wait" eben genau das - Warten! In der Zeit läuft nix anderes, und 4 Sekunden süßes Nichtstun sind wahrlich eine Ewigkeit für den Chip.

Werden die Abläufe schneller oder zeitkritisch, dann brauchst Du die Rechenzeit und der Wait-Befehl hat schnell ausgedient...

Aber sonst, für selbst beigebracht, und wenn´s funktioniert wie es soll, ist es doch prima!

Wünsche Dir noch viel Spaß beim Programmieren, viele Grüße

Torsten

bigeggmc
07.03.2006, 23:15
funktionieren tut es, hatte da nur noch das problem das ich das programm am ende wieder starten konnte, was in der praxis nen kurzschluss nach sich ziehen würde, aber das hat ich mit einer if bedingung lösen können
naja, ohne scheiss, das hab ich mir in den letzten 2 :-b tagen wirklich selber beigebracht, das ist mein erstes, auch in der praxis anwendbares programm.
nun ja, ich hab leider noch ned die erfahrungen das mit anderen mitteln zu machen, speziell das mit der zeit, für einen leihen wie mich erklärt sich wait ja praktisch von selber ;) und die 4 sec sind nur da um das für mich zu veranschaulichen, normalerweise sind das so ca 1,5 sec bis der drehstrommotor so weit angelaufen ist das er hochschalten kann.
aber danke dir für deine antwort, ich werd mal gucken was sich dahinter verbirgt ;) bis jetzt versteh ich fast nur bahnhof ;)

gruss, basti

Torsten_G
07.03.2006, 23:45
Mit Timern lässt sich das auch lösen.
Einmal gestartet, läuft ein Timer immer bis zu seinem Grenzwert (bei 8 Bit also 255) und fängt dann wieder bei 0 an.


Config Timer0 =Timer, Prescale= 1/8/64/256/1024

Das bedeutet, Timer0 (der hat 8 Bit) wird bei jedem n-ten Prozessortakt um Eins erhöht, das bestimmst Du mit dem Wert bei Prescale.

Also, bei Prescale=1 läuft Timer0 alle 255 Takte einmal durch, bei 64 alle 255x64=16320 Takte, u.s.w.

Außerdem hängt die Durchlaufzeit auch noch vom Preload-Wert ab, denn wer sagt denn, dass Der Timer immer bei 0 starten muß.


Timer0=100

dann sind´s nur noch 155 Zyklen bis zum Überlauf...

Ferner kann jedem Timer eine eigene Interrupt-Service-Routine (ISR) zugeordnet werden, die bei Erreichen des Überlaufs aufgerufen wird:


On Timer0 Gosub Irgendwohin

Enable Interrupts

Start Timer0

Irgendwohin:
'Erhöhe z.B. eine Zählvariable
Return

Egal, wo sich das Hauptprogramm grade befindet, wird diese Routine beim Timer-Überlauf abgearbeitet und dann zur Aussprungstelle zurückgekehrt.

Schau mal in die Bascom-Hilfe, die Timer sind da sehr gut erklärt, mit vielen Beispielen.

Und folge unbedingt mal diesem Link (https://www.roboternetz.de/phpBB2/dload.php?action=file&file_id=169) und lade Dir Franks Berechnungstool herunter.

Damit ist es eine Kleinigkeit, sich einen Timer für eine bestimmte Frequenz zurechtzubiegen, und es liefert gleich ein fertiges Bascom-Codeschnipsel zum Einbinden ins Programm!

Ein tolles Tool, zumindest für uns Weichei-Bascom-Programmierer, wahre Genies rechnen das natürlich im Kopf aus... :-$

Und noch ein Tipp, klick mal auf die blauen Wörter hier im Beitrag, diese Begriffe sind auf die Wissensdatenbank des Forums verknüpft.

Viele Grüße

Torsten