- Akku Tests und Balkonkraftwerk Speicher         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 21

Thema: 3 ATMega8 verbinden? Bus?

  1. #11
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627
    Anzeige

    Powerstation Test
    Hallo,
    der Testaufbau ist fertig.
    Der Sender sendet nun ca alle 10 Sekunden den Text "Wert1"
    Print "Wert1"

    Der Empfänger soll den Text erstmal nur empfangen und auf dem LCD ausgeben. Leider tauchen alle 10 sekunden nur ein paar zahlen auf....

    (Damit der µC noch etwas nebeibei tut, wird Variable Test1 und Test2 hochgezählt und die LCD Beleuchtung blinkt um zu sehen das der µC aktiv ist)

    Hier mein Empfängercode:
    Code:
    'Autobussystem Empfänger
    'basierend auf RS232
    
     'Problem mit Taster 5??? NEIN, weil Progadapter drauf war!!!
    '-------------------------------------------------------------------------------
    'Konfiguration µC:
    
    $regfile = "m8def.dat"                                      'AT-Mega8
    $crystal = 8000000                                          'Quarz: 8 MHz
    $baud = 9600                                                'Baudrate definieren
    '-------------------------------------------------------------------------------
    'Ein / Ausgänge definieren:
    Ddrb = &B11000001                                           'PB7-0: 1 Ausgang, 0 Eingang = Pin PB5-1 als Eingang
    Ddrc = &B0000001                                            'PC6-0: 1 Ausgang, 0 Eingang = Pin PC6-1 als Eingang
    
    'PullUps setzen:
    Portb = &B00111110                                          '1 = PullUp AKTIV   ->PB 7,6,0 nicht aktiv
    Portc = &B0111110                                           '1 = PullUp AKTIV   ->PC 6,0 nicht aktiv
    
    
    '-------------------------------------------------------------------------------
    'LCD konfiguration
    Config Lcd = 16 * 2                                         'LCD größe
    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , Rs = Portb.6 , E = Portb.7
    Cursor Off Noblink
    
    '-------------------------------------------------------------------------------
    'Alias
    Taster1 Alias Pinb.1
    Taster2 Alias Pinb.2
    Taster3 Alias Pinb.3
    
    
    
    '-------------------------------------------------------------------------------
    'Variablen
    Dim Test1 As Integer
    Dim Test2 As Integer
    
    Dim Wert1 As Integer
    Dim Wert2 As Integer
    
    Dim I As integer                                               'Wert von RS232
    '-------------------------------------------------------------------------------
    'Timer
    'Timer1 = 2x / sec bei 8MHz
    Config Timer1 = Timer , Prescale = 256                      'Teiler
    Const Timervorgabe = 49910
    Enable Timer1
    Enable Interrupts
    On Timer1 Lcd                                               'timer einschalten
    
    
    '-------------------------------------------------------------------------------
    'Für RS232:
    On Urxc Onrxd                                               'Interrupt-Routine setzen
    Enable Urxc                                                 'Interrupt URXC einschalten
    Enable Interrupts                                           'Interrupts global zulassen
    '-------------------------------------------------------------------------------
    
    Main:                                                       'Hauptschleife
    
    'analogeingang auslesen und in Variable Wert1 schreiben
    
    'IRGENDETWAS MACHEN:
    Incr Test1
    If Test1 = 65000 Then
    Toggle Portc.0                                              'LCD Beleuchtung
    Incr Test2
    Test1 = 0
    End If
    
    
    Goto Main
    
    '-------------------------------------------------------------------------------
    Onrxd:
    I = Udr                                                     'aus der UART auslesen
    Lcd I
    
    'If I = "Wert1" Then
    'Print Wert1                                                 'Wobei Wert1 zb. ein vorher analogeingelesender Wert ist
    'Locate 2 , 1
    'Lcd Wert1
    'End If
    
    Return
    
    
    '-------------------------------------------------------------------------------
    'Timer0zähler:
    'Timer1 = 49910
    'Incr Timer0_60
    '
    'If Timer0_60 > 30 Then
    'Timer0_60 = 0
    'Gosub Lcd                                                   'und später das Programm hier fortführen!
    'Toggle Portc.0
    'End If
    'Return
    
    
    
    '-------------------------------------------------------------------------------
    Lcd:
    Timer1 = 49910
    Cls                                                         'Display löschen (IMMER ERST LCD LÖSCHEN UND DANN POSITION ANGEBEN!!!)
    Locate 1 , 1
    Lcd "Test2: " ; Test2
    'Locate 2 , 1
    'Lcd + Str(timer0_60)
    Return
    
    
    '===============================================================================
    'Pinbelegung µC    Miri Rechner
    '===============================================================================
    '                    AT MEGA 8
    '                    +---U---+
    '         Reset  PC6 +1    28+ PC5 Taster10
    '          RXD   PD0 +2    27+ PC4 Taster9
    '          TXD   PD1 +3    26+ PC3 Taster8
    '                PD2 +4    25+ PC2 Taster7
    '                PD3 +5    24+ PC1 Taster6
    '                PD4 +6    23+ PC0 LCD Beleuchtung
    '                Vcc +7--- 22+ GND           | / Reset  |
    '                GND +8  |-21+ AREF          | / GND    |
    '            RS  PB6 +9  |-20+ AVCC          | / +5V    |
    '            E   PB7 +10   19+ PB5  Taster5  | / SCK    |
    '    / LCD / DB4 PD5 +11   18+ PB4  Taster4  | / MISO   |
    '    / LCD / DB5 PD6 +12   17+ PB3  Taster3  | / MOSI   |
    '    / LCD / DB6 PD7 +13   16+ PB2  Taster2  ___________
    '    / LCD / DB7 PB0 +14   15+ PB1  Taster1
    '                    +-------+
    
    
    
    '===============================================================================
    'Pinbelegung AM LCD!!!!!!! ACHTUNG!!!!!
    '===============================================================================
    'Pin 1: GND
    'Pin 2: +5V
    'Pin 3: Kontrast (0-5V)
    'Pin 4: RS  -> AVR
    'Pin 5: R/W -> GND (read/write mode, nur writen)
    'Pin 6: E   -> AVR
    'Pin 7-10:  -> GND
    'Pin 11-14: -> AVR -> 11=DB4 / 12=DB5 / 13=DB6 / 14=DB7
    'Pin 15-16: Beleuchtung
    ...

  2. #12
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627
    Also
    wenn ich statt einem Wort einen Buchstaben sende:
    Print "W"
    dann geht es:

    Code:
    dim i as byte
    
    '---
    
    Onrxd:
    I = Udr                                                     'aus der UART auslesen
    
    If I = "W" Then
    Print Wert1                                                 'Wobei Wert1 zb. ein vorher analogeingelesender Wert ist
    Locate 2 , 1
    Lcd "Wert1"
    End If
    
    Return
    gibt es eine Möglichkeit ein Wort zu empfangen?

    Tobias
    ...

  3. #13
    Erfahrener Benutzer Robotik Einstein Avatar von Vitis
    Registriert seit
    06.01.2005
    Ort
    Südpfalz
    Alter
    50
    Beiträge
    2.253
    senden und empfangen tust Du immer Bytes ... die kannste aber
    zu Word, Long, Single zusammensetzen
    Vor den Erfolg haben die Götter den Schweiß gesetzt

  4. #14
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.08.2007
    Ort
    Oberhofen im Inntal (Tirol)
    Alter
    49
    Beiträge
    377
    Zitat Zitat von TobiasBlome
    gibt es eine Möglichkeit ein Wort zu empfangen?
    Hallo Tobias!

    Die einfachste Möglichkeit: Sende die Zahl als Text und wandle den Text beim Empfänger mit VAL in eine Zahl um.

    Und noch etwas: Nimm RS-485 für dein Vorhaben. RS-485 ist besser für deine Entfernungen geeignet. An jeden µC einen MAX485 dran und schon ist die Sache erledigt. In Bascom musst du nur noch mit CONFIG PRINT den Pin einstellen, der den MAX485 in den Sendemodus schaltet. Fertig!

    Außerdem würde ich CONFIG SERIALIN beim Empfänger verwenden. Das vereinfacht das Programm.

    - http://avrhelp.mcselec.com/index.html?val.htm
    - http://avrhelp.mcselec.com/index.html?mid.htm
    - http://avrhelp.mcselec.com/index.html?configprint.htm
    - http://halvar.at/elektronik/kleiner_...om_computer_2/ (CONFIG SERIALIN)
    - http://halvar.at/elektronik/rs485/

    mfg
    Gerold
    :-)

  5. #15
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627
    Hallo,
    ich habe einiges gelesen - darum kann ich erst nun schreiben - aber mit Erfolg - zumindes ein bisschen

    Den Befehl zum senden habe ich nun aufgeteilt in: #Slave,Parameter:Wert"CR"
    so kann ich genau sagen für welchen µC die Nachricht ist, um welche Daten es sich handelt (Strom, Spannung...) und natürlich den Wert, der später dafür auf das LCD soll:
    Der Sender hat nun (zum testen)den Befehl: Print "#S1,Strom:1234"

    Leider zeigt der Empfänger das Wort "Strom" nicht an?!

    Die Anzeige auf dem LCD vom Empfänger ist nun: S1,0:1234
    soweit richtig - bis auf die 0 - da sollte "Strom" stehen - kann mir das einer erklären?

    Code:
    '-------------------------------------------------------------------------------
    'Konfiguration µC:
    
    $regfile = "m8def.dat"                                      'AT-Mega8
    $crystal = 8000000                                          'Quarz: 8 MHz
    $baud = 9600                                                'Baudrate definieren
    '-------------------------------------------------------------------------------
    'Ein / Ausgänge definieren:
    Ddrb = &B11000001                                           'PB7-0: 1 Ausgang, 0 Eingang = Pin PB5-1 als Eingang
    Ddrc = &B0000001                                            'PC6-0: 1 Ausgang, 0 Eingang = Pin PC6-1 als Eingang
    
    'PullUps setzen:
    Portb = &B00111110                                          '1 = PullUp AKTIV   ->PB 7,6,0 nicht aktiv
    Portc = &B0111110                                           '1 = PullUp AKTIV   ->PC 6,0 nicht aktiv
    
    
    '-------------------------------------------------------------------------------
    'LCD konfiguration
    Config Lcd = 16 * 2                                         'LCD größe
    Config Lcdpin = Pin , Db4 = Portd.5 , Db5 = Portd.6 , Db6 = Portd.7 , Db7 = Portb.0 , Rs = Portb.6 , E = Portb.7
    Cursor Off Noblink
    
    '-------------------------------------------------------------------------------
    'Alias
    Taster1 Alias Pinb.1
    Taster2 Alias Pinb.2
    Taster3 Alias Pinb.3
    
    
    
    '-------------------------------------------------------------------------------
    'Variablen
    Dim Test1 As Integer
    Dim Test2 As Integer
    
    Dim Wert1 As Integer
    Dim Wert2 As Integer
    
    
    '--
    Dim Slave As String * 3 , Para As String * 10 , Wert As String * 4 , Parameter As Integer
    Dim E_byte As Byte , E_flag As Byte
    
    '-------------------------------------------------------------------------------
    'Timer
    'Timer1 = 2x / sec bei 8MHz
    Config Timer1 = Timer , Prescale = 256                      'Teiler
    Const Timervorgabe = 49910
    Enable Timer1
    Enable Interrupts
    On Timer1 Lcd                                               'timer einschalten
    
    
    '-------------------------------------------------------------------------------
    'Für RS232:
    On Urxc Onrxd                                               'Interrupt-Routine setzen
    Enable Urxc                                                 'Interrupt URXC einschalten
    Enable Interrupts                                           'Interrupts global zulassen
    '-------------------------------------------------------------------------------
    
    Main:                                                       'Hauptschleife
    
    'analogeingang auslesen und in Variable Wert1 schreiben
    
    'IRGENDETWAS MACHEN:
    Incr Test1
    If Test1 = 65000 Then
    Toggle Portc.0                                              'LCD Beleuchtung
    Incr Test2
    Test1 = 0
    End If
    
    '--
    If E_flag = 4 Then                                          'Empfangsstring komplett
      Parameter = Val(para)                                     'aus String Integer machen
      Cls
      Locate 2 , 1
      Lcd Slave ; "," ; Parameter ; ":" ; Wert                  'LCD
      Waitms 200
      Slave = ""                                                'Slave löschen
      Para = ""                                                 'Parameter löschen
      Wert = ""                                                 'Wert löschen
      E_flag = 0                                                'Empfang neu setzen
    End If
    
    Goto Main
    
    '-------------------------------------------------------------------------------
    Onrxd:
    E_byte = Udr
    Select Case E_byte
      Case 35 : E_flag = 1                                      '"#" = Slave wird gesendet
      Case 44 : E_flag = 2                                      '"," = Parameter kommt
      Case 58 : E_flag = 3                                      '":" =
      Case 13 : E_flag = 4                                      '"ENTER" = Empfang komplett
      Case Else : If E_flag = 1 Then Slave = Slave + Chr(e_byte)
                   If E_flag = 2 Then Para = Para + Chr(e_byte)
                   If E_flag = 3 Then Wert = Wert + Chr(e_byte)
    
    End Select
    
    
    
    
    
    
    Return
    
    
    '-------------------------------------------------------------------------------
    'Timer0zähler:
    'Timer1 = 49910
    'Incr Timer0_60
    '
    'If Timer0_60 > 30 Then
    'Timer0_60 = 0
    'Gosub Lcd                                                   'und später das Programm hier fortführen!
    'Toggle Portc.0
    'End If
    'Return
    
    
    
    '-------------------------------------------------------------------------------
    Lcd:
    Timer1 = 49910
    'Cls                                                         'Display löschen (IMMER ERST LCD LÖSCHEN UND DANN POSITION ANGEBEN!!!)
    Locate 1 , 1
    Lcd "Test2: " ; Test2
    'Locate 2 , 1
    'Lcd + Str(timer0_60)
    Return
    Tobias

    @python_rocks:
    benötige ich für RS485 wirklich nur das IC und den Pin der den MAX485 in den Sendemodus schaltet? Das wäre ja "einfach"
    ...

  6. #16
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627
    oh - ich muss mich korregieren
    manchmal steht es auch richtig im LCD...

    S1,Strom:1234

    aber das ist sehr selten der Fall.....
    ...

  7. #17
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627
    oh oh oh......

    das kommt davon wenn man andere codeschnipsel kopiert.....

    Das gehört hier doch gar nicht hin: Parameter = Val(para)

    und nun läuft das Programm \/

    nun kann ich weiter programmieren


    Tobias
    ...

  8. #18
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.08.2007
    Ort
    Oberhofen im Inntal (Tirol)
    Alter
    49
    Beiträge
    377
    Zitat Zitat von TobiasBlome
    @python_rocks:
    benötige ich für RS485 wirklich nur das IC und den Pin der den MAX485 in den Sendemodus schaltet? Das wäre ja "einfach" ;-)
    Hallo Tobias!

    Ja, so einfach ist das. :D

    Allerdings solltest du in einem Interrupt-Handler nicht, niemals nicht, etwas auf dem LCD anzeigen.
    Schreibe lieber das was anzuzeigen ist in eine Variable und zeige es in der Hauptschleife an, wenn genug Zeit dafür ist. Der LCD-Befehl dauert einfach zu lange, als dass man ihn in einem Interrupt-Handler verwenden kann. Du musst bedenken, dass während die Daten auf das LCD geschrieben werden, kein anderer Interrupt ausgeführt werden kann. Im schlimmsten Fall, verlierst du Daten beim Empfang über die UART, da diese schneller rein kommen als du sie abrufen kannst.

    mfg
    Gerold
    :-)

  9. #19
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    06.07.2006
    Alter
    94
    Beiträge
    627
    z.b. so?

    ...
    Do
    if Merker = 1 then

    Cls
    Locate 1 , 1
    Lcd "Hallo"
    Merker=0

    End If
    ...
    '___________________
    ontimer1:
    Merker=1
    Return
    ...

  10. #20
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    05.08.2007
    Ort
    Oberhofen im Inntal (Tirol)
    Alter
    49
    Beiträge
    377
    Zitat Zitat von TobiasBlome
    z.b. so?
    ja, genau so :-)

Seite 2 von 3 ErsteErste 123 LetzteLetzte

Berechtigungen

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

MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad