- Akku Tests und Balkonkraftwerk Speicher         
Ergebnis 1 bis 5 von 5

Thema: Programm Läuft nicht richtig,hilfen Sie mir mal

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    12.05.2005
    Beiträge
    12

    Programm Läuft nicht richtig,hilfen Sie mir mal

    Anzeige

    E-Bike
    es ist nur ein teile test programm, mickrontrolle AT90S8535 in STK200
    über RS232 mit PC verbinden. signal nach jeder 5 Sekunden sollen Daten über UART transportiert werden .

    Das heisst,nach jeder 5 sekunde wird Interrupt ausgelöst,und daten über UART senden.
    ich denke, bei mein Programm fehlt etwa verbindung zw Senden und Interrupt,aber ich weis nicht wie ich es korrigieren.

    könnte jemand mir helfen?



    Code:
    .include"8535def.inc"
    .def temp=r16
    .def infor=r19
    .def laenger=r20
    .def kommando=r21
    
    
    
    .equ quartz=2457600   ;Seite 60,64,XTAL->Baudrategenerator  
    .equ baud=9600    
    .equ start=65536-39060
    
    .equ highvalue=high(start)
    .equ lowvalue=low(start)
    
    .org 0X000
        rjmp reset           ;reset handler
    .org 0X008
        rjmp TIM1_OVF        ;time1 overflow handler
    
    
    reset:                 
      ldi temp,low(RAMEND)
      out spl,temp             ;Seite 21
      ldi temp,high(RAMEND)    ;Stackpoint initialisieren
      out sph,temp
    
      
     
      ldi temp,1<<TXEN    ;Seite 63
      out UCR,temp        ;Seite 64
      ldi temp,quartz/(baud*16)-1 
      out UBRR,temp       ; UART initialisieren
    
      
      ldi temp,1<<TOIE1
      out TIMSK,temp      ;time1 interrupt ein , Seite 27
      ldi temp,0b00000101 ;Seite 38
      out TCCR1B,temp     ;bit2-0 define the Prescaling 
                          ;source of Timer/Counter1
      
      sei                 ;interrupts generelle aktivieren
    
    
     loop:   
           ldi temp,1
           mov r1,temp
           ldi temp,2
           mov r2,temp
           ldi temp,3
           mov r3,temp
           ldi temp,4
           mov r4,temp
           ldi temp,5
           mov r5,temp
           ldi temp,6
           mov r6,temp
           ldi temp,7
           mov r7,temp
           ldi temp,8 
           mov r8,temp    
        rjmp loop   
    
    
    senden:
              mov temp,r1     
              rcall senden2   
    
              mov temp,r2
              rcall senden2
              
              mov temp,r3
              rcall senden2
       
              mov temp,r4
              rcall senden2
              
              mov temp,r5
              rcall senden2
              
              mov temp,r6
              rcall senden2
              
              mov temp,r7
              rcall senden2
              
              mov temp,r8
              rcall senden2
       
             ret
    
    
    
    senden2:
           sbis USR,UDRE     ;skip if bit in I/O register set
           rjmp senden2      ;warten bis UDR fuer naechster Btyte 
           out UDR,temp      ;bereit ist,   Datenblatte  Seite 62
           ret   
    
    
    
    TIM1_OVF:
                              
           ldi temp,highvalue
           out TCNT1H,temp    ;Datenblaette Seite 38 
           ldi temp,lowvalue  ;Startwert des Timers einstellen 
           out TCNT1L,temp    ;39060 Takt ist 5 Sekunde
            
                              ;nach 5 sekunde ist interrupt ausgeloest
           rcall senden       ;aufrufen Senden Funktion
                    
           reti
    [/list]

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Versteh' nicht ganz, welche Verbindung meinst du ?
    Unter der Annahme, daß die Baudrate etc. stimmt, sollte der Timer ja ansprechen und auch senden.
    Allerdings sind die Daten (1 - 8 ) auf einem Terminal nicht gut zu lesen
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Hallo,
    So wie ich das sehe muß Du in der resetroutine den Startwert des Timers in TCNT1 laden
    (in deinem Beispiel highvalue und lowvalue).
    Das machst Du zwar schön in dem Interrupthandler (ist ja korekt, weil er nachdem er ablaufen ist, neu belegt werden soll), aber am Anfang machst Du das nicht.
    Meiner Meinung nach wird bei Deinem Beispiel nie ein Interrupt ausgelöst.
    Schreib also die ersten 4 Zeilen vom TIM1_OVF nochmal irgendwo in den resethandler

    Was mir sonst noch aufgefallen ist, Deine loop: Schleife wozu schiebst Du die Register hin und her?
    in meinen Augen kannst Du auch in der resetroutine die Register R1 bis R8 belegen und gut ist es.
    Du tust die sowieso nirgendwo mehr verändern.
    Du sendest zahlen 1-9 an UART, müßen die nicht in ASCII format vorliegen ?
    Das wäre das wichtigste.

    Wenn ich was falsch geschrieben habe, wäre ich froh wenn man micht darauf aufmerksam macht.
    Ich kann Dir nur das oder das empfehlen.
    Dort findest Du genug Beispiele wie man sowas auf die Beine stellt.

    viel Erfolg
    Sebastian

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    12.05.2005
    Beiträge
    12
    dank dir izaseba

    wess du ist die initialisierung von UART richtig?

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    52
    Beiträge
    2.236
    Hallo,
    Ich will hier nicht Faul erscheinen, aber ich füge hier ein Ausschnitt von mikrocontroller.net
    wie man die UART Schnittstelle initialisieren soll.
    Es bezieht sich zwar auf Mega8 bzw. auf AT90S4433, das Prinzip sollte aber gleich sein.
    Eventuell im Datenblatt bzw. in *.inc nachlesen, ob die Register genauso heißen

    Als erstes muss die gewünschte Baudrate im Register UBRR festgelegt werden. Der in dieses Register zu schreibende Wert errechnet sich nach der folgenden Formel:

    UBRR = Taktfrequenz / 16 * Baudrate - 1

    Beim AT90S4433 kann man den Wert direkt in das Register UBRR laden, beim ATmega8 gibt es für UBRR zwei Register: UBRRL (Low-Byte) und UBRRH (High-Byte). Im Normalfall steht im UBRRH 0, da der berechnete Wert kleiner als 256 ist und somit in UBRRL alleine passt.

    Um den Sendekanal des UART zu aktivieren, muss das Bit TXEN im UART Control Register UCSRB auf 1 gesetzt werden.
    Danach kann das zu sendende Byte in das Register UDR eingeschrieben werden - vorher muss jedoch sichergestellt werden, dass das Register leer ist, die vorhergehende Übertragung also schon abgeschlossen wurde. Dazu wird getestet, ob das Bit UDRE ("UART Data Register Empty") im Register UCSRA auf 1 ist.
    Genaueres über die UART-Register findet man im Datenblatt des Controllers.

    Der ATmega8 bietet noch viele weitere Optionen zur Konfiguration des UARTs, aber für die Datenübertragung zum PC sind im Normalfall keine anderen Einstellungen notwendig.

    Das Beispielprogramm überträgt die Zeichenkette "Test!" in einer Endlosschleife an den PC. Die folgende Version ist für den ATmega8 geschrieben; wer den AT90S4433 verwendet findet die passende Version hier.
    Gruß Sebastian

Berechtigungen

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

Labornetzteil AliExpress