- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 2 von 2

Thema: .equ potenz rechnen

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.11.2004
    Beiträge
    451

    XMEGA BAUDRATE berechnen

    Anzeige

    Praxistest und DIY Projekte
    Hi,

    hab grad ein Problem und komm nicht weiter.

    Bin grad am USART für den XMEGA zu programmieren, genauer die Baudrate bestimmen

    Hat von euch mal einer versucht mit einem .equ potenzrechnung zu benutzten?

    Code:
    .equ BSEL = F_PER / (2^BSCALE * 16 * BAUD) - 1
    liefert als Ergebnis nur F_PER / 2 bricht also bei dem ^ ab.

    alternativ hab ich auch POW(2,BSCALE) versucht aber will auch nicht, kennt er nicht und bringt ein '(' fehler.

    Die Formeln sind in dem "XMEGA A Manual.pdf" auf Seite 238 zu finden

    hier noch mal die gesamte abfrage:
    Code:
    .equ Baud = 9600
    .equ CLK2X = 0
    .equ BSCALE = 0
    .equ F_PER  = 2000000
    
    .if (CLK2X < 1) 
        .if (BSCALE >= 0) 
            .equ BSEL = F_PER / (2^BSCALE * 16 * BAUD) - 1
            .equ BAUD_REAL = F_PER / (2^BSCALE * 16 * (BSEL + 1))
        .else
            .equ BSEL = 1 / (2^BSCALE) * ((F_PER / 16 * BAUD) - 1)
            .equ BAUD_REAL = F_PER / (16 * ((pow(2,BSCALE) * BSEL) + 1))
        .endif
        .if (BAUD > (F_PER / 16))
            .error "BAUD zu groß, oder Periferie clock zu klein: (vllt. CLK2X?)"
        .endif
        
    .else
        .if (BSCALE >= 0) 
            .equ BSEL = (F_PER / (2^BSCALE * 8 * BAUD) - 1)
            .equ BAUD_REAL = (F_PER / (2^BSCALE * 8 * (BSEL + 1)))
        .else
            .equ BSEL = (1 / (2^BSCALE) * ((F_PER / 8 * BAUD) - 1))
            .equ BAUD_REAL = (F_PER / (8 * ((2^BSCALE * BSEL) + 1))
        .endif
        .if (BAUD > (F_PER / 8))
            .error "BAUD zu groß, oder Periferie clock zu klein: Periferieclock erhöhen"
        .endif
    .endif
    
    
    .equ BAUD_ERROR = ((BAUD_REAL * 1000) / BAUD - 1000)
    
    
    .if ((BAUD_ERROR > 10) || (BAUD_ERROR < -10))       ; max. +/-10 Promille Fehler
    ;  .error "Systematischer Fehler der Baudrate groesser 1 Prozent und damit zu hoch!"
    .endif
    Baud_ERROR gibt die Abweichung des eingestellten Werts in Promille an, laut Taschenrechner stimmt alles, also ~0,15% Abweichung

    Wäre cool, wenn jemand mir helfen könnte.
    Geändert von robin (17.05.2012 um 19:09 Uhr)

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    26.11.2004
    Beiträge
    451
    So,

    Die Lösung kann so einfach sein, einfach das ding verschieben und gut ist ist ja bei 2^x das selbe (Scheiß Hochsprachen mit ihrem ^ )
    Das ^ ist neben bei eine XOR verknüpfung, wieder was gelernt

    Der Rest vom Code kann ich bei bedarf auch noch posten, sind nur so triviale Sachen wie UASRT send, receive und init drin.

    Code:
    ;----------------------------------------------------------------------------
    ;        Variablen
    ;----------------------------------------------------------------------------
    
    .equ USART = USARTE0_base                // Basis Adresse des Verwendeten USART
    .equ PORT = PORTE_base                    // Basis Adresse des Verwendeten Ports
    .equ TX_EN = 1                            // Receive enable:        0 = disabled, 1 = enabled
    .equ RX_EN = 1                            // Transmit  enable:    0 = disabled, 1 = enabled
    
    
    .equ BAUD = 9600
    .equ BIT = USART_CHSIZE_8BIT_gc            // 5, 6, 7, 8, (9) Databits
    .equ PARRITY = USART_PMODE_ODD_gc        // allowed values ODD, EVEN, DISABLED 
    .equ STOP = 1                            // 0 = 1bit, 1 = 2bit
    
    
    .equ CLK2X = 1                            // double speed:        0 = disabled, 1 = enabled
    .equ BSCALE = -7
    
    .equ F_PER  = 2000000 
    
    
    ;----------------------------------------------------------------------------
    ;        Berechnungen
    ;----------------------------------------------------------------------------
    .if (CLK2X < 1)
        .if (BSCALE >= 0)
            .equ BSEL = ((F_PER / ((1<<BSCALE) * 16 * BAUD)) - 1)
            .equ BAUD_REAL = F_PER / ((1<<BSCALE) * 16 * (BSEL + 1))
        .else
            .equ BSEL = ((1 << -BSCALE) * ((F_PER / (16 * BAUD)) - 1))
            .equ BAUD_REAL = (F_PER * (1 << -BSCALE) / (16 * ((1 << -BSCALE) + BSEL)))
        .endif
        .if (BAUD > (F_PER / 16))
            .error "BAUD zu groß, oder Periferie clock zu klein: (vllt. CLK2X?)"
        .endif
        
    .else
        .if (BSCALE >= 0) 
            .equ BSEL = ((F_PER / ((1<<BSCALE) * 8 * BAUD)) - 1)
            .equ BAUD_REAL = F_PER / ((1<<BSCALE) * 8 * (BSEL + 1))
        .else
            .equ BSEL = ((1 << -BSCALE) * ((F_PER / (8 * BAUD)) - 1))
            .equ BAUD_REAL = (F_PER * (1 << -BSCALE) / (8 * ((1 << -BSCALE) + BSEL)))
        .endif
        .if (BAUD > (F_PER / 8))
            .error "BAUD zu groß, oder Periferie clock zu klein: Periferieclock erhöhen"
        .endif
    .endif
    
    
    
    
    .equ BAUD_ERROR = ((BAUD_REAL * 1000) / BAUD - 1000)
    
    
    .if ((BAUD_ERROR > 10) || (BAUD_ERROR < -10))       ; max. +/-10 Promille Fehler
      .error "Systematischer Fehler der Baudrate groesser 1 Prozent und damit zu hoch!"
    .endif
    E: Threadtitel geändert

Ähnliche Themen

  1. Rechnen mit Gleitkommazahlen
    Von daniel.weber im Forum C - Programmierung (GCC u.a.)
    Antworten: 20
    Letzter Beitrag: 09.05.2011, 15:38
  2. Effizienter Rechnen?
    Von BASTIUniversal im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 02.01.2008, 18:54
  3. Gruppenschaltung rechnen
    Von Larzarus im Forum Elektronik
    Antworten: 7
    Letzter Beitrag: 28.07.2006, 17:55
  4. Rechnen mit Bascom
    Von atvler im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 12
    Letzter Beitrag: 22.05.2006, 22:50
  5. Rechnen mit 3 Registern
    Von Philipp83 im Forum Software, Algorithmen und KI
    Antworten: 9
    Letzter Beitrag: 10.05.2006, 11:46

Berechtigungen

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

12V Akku bauen