- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 4 von 4

Thema: Stern-Dreieckschaltung mit Atmega8 (erstwerk)

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    06.03.2006
    Beiträge
    25

    Stern-Dreieckschaltung mit Atmega8 (erstwerk)

    Anzeige

    Praxistest und DIY Projekte
    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
    Code:
    $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?

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.02.2005
    Beiträge
    175
    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

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    06.03.2006
    Beiträge
    25
    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 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

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.02.2005
    Beiträge
    175
    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.

    Code:
    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ß.

    Code:
    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:

    Code:
    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 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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress