- Akku Tests und Balkonkraftwerk Speicher         
Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 25

Thema: Unterprogramme

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    22.03.2012
    Beiträge
    80

    Unterprogramme

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo
    wie kann ich in Bascom Unterprogramme machen ich habe ein sehr langes Programm und es ist auch mit RS232 steuerbar und ich möchte diese Steuerung gerne in ein Unterprogramm packen Sodas die restliche Steuerung ohne Pausen weiter läuft.

    Danke im Voraus

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    15.01.2007
    Ort
    Göttingen
    Beiträge
    706
    Mit den Befehlen Gosub und Return.

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    Code:
    Do
       Reset Watchdog' wenn man ihn nutzt
       Gosub Uhranzeigen ' wird jedesmal aufgerufen
    
       If Ischarwaiting() = 1 Then ' Wenn Zeichen über RS232 angekommen ist, dann dahin, sonst einfach mit Hauptschleife weitermachen
            Gosub Empfangen
       End If
    Loop
    End
    
    Empfangen:
       A = Inkey()
       If A >= 13 Then ' alles kleiner 13 wird einfach abgeschnitten. Nutze ich hauptsächlich, da ich Werte im String übertrage
             If A = 13 Then
                Gosub Auswerten
             Else
                If Len(seingang) < Maxlaenge Then ' nicht, dass seingang "platzt" und die nächsten Variablen überschreibt
                   Seingang = Seingang + Chr(a)
                End If
             End If
       End If
    Return
    
    Auswerten:
    ... '  hier der Code, um das Empfangene auszuwerten
    ...
    ...
    return
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    22.03.2012
    Beiträge
    80
    $crystal = 1000000
    $regfile = "m16def.dat"
    $baud = 2400
    Config Pinb.6 = Input
    Config Portc = Output




    Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Prescale = 1

    Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , _
    Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0

    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Start Adc

    Config Lcd = 16 * 2
    Cursor Off
    Cls


    Dim Asd As String * 255
    Dim P1 As Integer
    Dim P2 As Integer
    Dim P3 As Integer
    Dim P4 As Integer
    Dim P5 As Integer
    Dim P6 As Integer
    Dim P7 As Integer
    Dim P8 As Integer
    Dim P9 As Integer
    Dim P10 As Integer

    Do


    If Pinb.6 = 0 Then
    Locate 1 , 1
    Lcd P1

    Locate 1 , 5
    Lcd "P1"

    Locate 1 , 8
    Lcd P2

    Locate 1 , 12
    Lcd "P2"

    Locate 2 , 1
    Lcd P3

    Locate 2 , 5
    Lcd "P3"

    Locate 2 , 7
    Lcd P4

    Locate 2 , 11
    Lcd "P4"

    Locate 2 , 13
    Lcd P5

    Else

    Locate 1 , 1
    Lcd P6

    Locate 1 , 5
    Lcd "P6"

    Locate 1 , 8
    Lcd P7

    Locate 1 , 12
    Lcd "P7"

    Locate 2 , 1
    Lcd P8

    Locate 2 , 5
    Lcd "P8"

    Locate 2 , 7
    Lcd P9

    Locate 2 , 11
    Lcd "P9"

    Locate 2 , 13
    Lcd P10
    End If

    P6 = Getadc(0)
    P7 = Getadc(1)
    P8 = Getadc(2)
    P9 = Getadc(3)
    P10 = Getadc(4)

    If P1 <> P6 Then Portc.0 = 1 Else Portc.0 = 0
    If P1 = P6 Then Portc.1 = 1 Else Portc.1 = 0

    If P2 <> P7 Then Portc.2 = 1 Else Portc.2 = 0
    If P2 = P7 Then Portc.3 = 1 Else Portc.3 = 0

    If P3 <> P8 Then Portc.4 = 1 Else Portc.4 = 0
    If P3 = P8 Then Portc.5 = 1 Else Portc.5 = 0

    If P4 <> P9 Then Portc.6 = 1 Else Portc.6 = 0
    If P4 = P9 Then Portc.7 = 1 Else Portc.7 = 0

    'ANFANG UNTERPROGRAMM

    Asd = ""
    Input Asd

    Select Case Asd
    Case "1,"
    Input P1

    Print P1

    Case "2," 'p2 schreiben
    Input P2

    Print P2

    Case "3," 'p3 schreiben
    Input P3

    Print P3

    Case "4," 'p3 schreiben
    Input P4

    Print P4

    Case "5," 'p3 schreiben
    Input P5

    Print P5
    End Select

    'ENDE UNTERPROGRAMM

    Loop

    End
    ICH MÖCHTE DEN BEREICH WO anfang und ende unterprogramm steht in ein unterprogramm packen damit der rest einfach weiter läuft

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    18.05.2007
    Ort
    Berlin
    Alter
    53
    Beiträge
    765
    Der Rest läuft nicht einfach weiter. Ein Input blockiert den MC auch in einem Unterprogramm, wenn da keine Daten anliegen.

    Code:
    $crystal = 1000000
    $regfile = "m16def.dat"
    $baud = 2400
    Config Pinb.6 = Input
    Config Portc = Output
    
    
    
    
    Config Timer1 = Pwm , Pwm = 10 , Compare A Pwm = Clear Down , Prescale = 1
    
    Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , _
    Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0
    
    Config Adc = Single , Prescaler = Auto , Reference = Avcc
    Start Adc
    
    Config Lcd = 16 * 2
    Cursor Off
    Cls
    
    
    Dim Asd As String * 5
    Dim P0 As Byte At Asd Overlay
    Dim P1 As Word At Asd + 2 Overlay
    
    Dim B As Byte
    Dim P(10) As Word
    
    Do
    
    
    If Pinb.6 = 0 Then
       Locate 1 , 1
       Lcd P(1)
    
       Locate 1 , 5
       Lcd "P1"
    
       Locate 1 , 8
       Lcd P(2)
    
       Locate 1 , 12
       Lcd "P2"
    
       Locate 2 , 1
       Lcd P(3)
    
       Locate 2 , 5
       Lcd "P3"
    
       Locate 2 , 7
       Lcd P(4)
    
       Locate 2 , 11
       Lcd "P4"
    
       Locate 2 , 13
       Lcd P(5)
    
    Else
    
       Locate 1 , 1
       Lcd P(6)
    
       Locate 1 , 5
       Lcd "P6"
    
       Locate 1 , 8
       Lcd P(7)
    
       Locate 1 , 12
       Lcd "P7"
    
       Locate 2 , 1
       Lcd P(8)
    
       Locate 2 , 5
       Lcd "P8"
    
       Locate 2 , 7
       Lcd P(9)
    
       Locate 2 , 11
       Lcd "P9"
    
       Locate 2 , 13
       Lcd P(10 )
    End If
    
    P(6) = Getadc(0)
    P(7) = Getadc(1)
    P(8) = Getadc(2)
    P(9) = Getadc(3)
    P(10) = Getadc(4)
    
    If P(1) <> P(6) Then Portc.0 = 1 Else Portc.0 = 0
    If P(1) = P(6) Then Portc.1 = 1 Else Portc.1 = 0
    
    If P(2) <> P(7) Then Portc.2 = 1 Else Portc.2 = 0
    If P(2) = P(7) Then Portc.3 = 1 Else Portc.3 = 0
    
    If P(3) <> P(8) Then Portc.4 = 1 Else Portc.4 = 0
    If P(3) = P(8) Then Portc.5 = 1 Else Portc.5 = 0
    
    If P(4) <> P(9) Then Portc.6 = 1 Else Portc.6 = 0
    If P(4) = P(9) Then Portc.7 = 1 Else Portc.7 = 0
    
    'ANFANG UNTERPROGRAMM
    
    If Ischarwaiting() = 1 Then
       Gosub Empfangen
    End If
    'ENDE UNTERPROGRAMM
    
    Loop
    
    End
    
    Empfangen:
       B = Inkey()
       If Len(asd) < 5 Then
          Asd = Asd + Chr(b)
       End If
       If Len(asd) = 5 Then
          Gosub Auswerten
       End If
    Return
    
    
    Auswerten:
    If P0 > 0 And P0 < 6 Then
       P(p0) = P1
       Print P(p0)
    End If
    asd=""
    Return
    Könnte jetzt laufen.
    Jedoch wird keine Abweichung / Versatz abgefangen


    Wer sendet denn die Daten und wie werden die abgeschlossen?
    Geändert von peterfido (05.06.2012 um 19:27 Uhr) Grund: Neuer Code So könnte es laufen
    Wenn das Herz involviert ist, steht die Logik außen vor! \/

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    22.03.2012
    Beiträge
    80
    sie werden vom pc gesendet (bascom oder putty ) per RS232
    also jetzt ist es so das wenn ich 1, absende weiß der amtega16 die vari. p1 wird jetzt mit der nächsten zahl beschrieben und wenn er das gemacht hat gibt er die gleiche zahl zurück. nur hält das programm an wenn ich nichts sende was mein prob. ist

  7. #7
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Und was spricht dagegen einen USART Interrupt zu verwenden?
    Dann läuft das Programm weiter solange nichts empfangen wird. Sobald was empfangen wird, springt der Controller in die ISR und dort musst du dann die Daten aus dem Buffer holen und das Empfangene richtig zusammensetzen (wenn es ein String ist den du sendest).
    Guckste hier:

    http://www.rowalt.de/mc/avr/avrboard/06/avrb06.htm

    USART-Interrupts sind eh die elegantere Wahl um was zu empfangen. Eben aus deinem speziellen Grund.

    Edit:
    Und pack mal deinen Code zwischen {code} und {/code}. Nur halt diese Klammern nehmen []
    Dann sieht das so aus

    Code:
    Blablablabla
    Blablablabla
    Blablablabla
    Blablablabla
    Blablablabla
    Blablablabla
    Blablablabla
    Blablablabla
    Blablablabla
    und die Leser haben nicht direkt so eine Textwand vor sich. Ich für meinen Teil habe mir da erstmal nur gedacht TLDR - Too long don´t read....und ich bin sicher nicht der einzigste
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    22.03.2012
    Beiträge
    80
    kann einer von euch nich meinen code umändern weil ich kp von usart habe

    bitte

  9. #9
    Moderator Robotik Einstein Avatar von Kampi
    Registriert seit
    21.11.2009
    Ort
    Monheim, Nordrhein-Westfalen, Germany
    Alter
    34
    Beiträge
    3.501
    Blog-Einträge
    9
    Zitat Zitat von Zardest Beitrag anzeigen
    kann einer von euch nich meinen code umändern weil ich kp von usart habe

    bitte
    Was verstehst du den am USART nicht?
    Sagen wir es mal so....USART ist von den "Busen" her der einfachste
    Und wenn du den Bus nicht verstehst, dann nutz doch die Gelegenheit deines Problems um dich mal etwas intensiver mit ihm zu beschäftigen.
    Wenn dir das jetzt jemand vorkaut wirst du das Prinzip nie verstehen. Am meisten lernst du nicht wenn etwas funktioniert sondern wenn etwas NICHT funktioniert.
    Hilfestellung kann dir jeder hier geben.
    Aber wie heißt es so schön.....wir können dir den Weg zeigen. Aber ans Ziel musst du alleine kommen.
    Fang erstmal klein an. Nutze dafür den Link den ich dir gegeben habe. Und dann arbeite dich immer weiter vor.
    Schaut ruhig mal auf meiner Homepage vorbei :
    http://kampis-elektroecke.de

    Oder folge mir auf Google+:
    Daniel Kampert

    Es gibt 10 Arten von Menschen. Die einen können Binär, die anderen nicht.

    Gruß
    Daniel

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    22.03.2012
    Beiträge
    80
    danke aber ich blick da echt nich durch habe mir die seite angeschaut aber nop ich hab kp wie das gehen soll kanste mir den code nich machen dann hab ich was wo ich sehen kann aha da is mein eingang was ich sende und da schaltet der das so um das das programm weiter leuft.

Seite 1 von 3 123 LetzteLetzte

Ähnliche Themen

  1. Unterprogramme in C?
    Von Mindhunter im Forum Software, Algorithmen und KI
    Antworten: 8
    Letzter Beitrag: 01.10.2010, 10:47
  2. Problem: Unterprogramme mit Nullstellensuche
    Von wodka_cheery im Forum C - Programmierung (GCC u.a.)
    Antworten: 5
    Letzter Beitrag: 11.12.2007, 22:34
  3. unterprogramme machen
    Von drunkenmunky im Forum AVR Hardwarethemen
    Antworten: 2
    Letzter Beitrag: 09.04.2006, 17:45
  4. Externe Unterprogramme im AVR Studio
    Von kaisobczak im Forum AVR Hardwarethemen
    Antworten: 9
    Letzter Beitrag: 27.04.2005, 13:58
  5. [ERLEDIGT] zwei Unterprogramme sollen zur gleichen Zeit laufen
    Von Gast im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 7
    Letzter Beitrag: 30.03.2004, 14:40

Stichworte

Berechtigungen

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

12V Akku bauen