- Labornetzteil AliExpress    Werbung      
Ergebnis 1 bis 5 von 5

Thema: RFM12b an tiny2313 USI

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied Avatar von avr_racer
    Registriert seit
    01.04.2014
    Ort
    MecklenburgVorpommern
    Beiträge
    175
    Hallo,

    um es ein wenig übersichtlicher zu gestalten lager die Programmteile aus die im Moment nicht genutzt werden und binde sie später per Include ein.

    So wie cih dich verstehe versuchst du die RS232 bzw die UART zum laufen zu bringen. Im zweiten Post erstes Programm wird nach der Startsequenz ein RCALL LOOP aufegrufen welches aber in dem LOOP mit einem RJMP beendet wird. Erstmal weiter nicht tragisch nur solltest du zu Testzwecken es eher:

    Start:
    ....
    RJMP LOOP

    oder du schreibst es einfach ganz normal drunter weg

    Start:
    ...
    ...
    ...
    RJMP LOOP ;oder lääst das nach der Initialisierung in die loop laufen also ohne RJMP

    die .org 0x020 kannst du weg lassen wenn du halt fortlaufend arbeitest brauch man nur wenn du mit nem BOOTLOADER arbeiten willst ..... sonst weg damit.. erstmal

    loop:
    mov data, lsb
    sleep
    cp data, lsb
    breq loop
    mov temp1, lsb
    rcall seroutdez
    rjmp loop



    Code:
    ;;;Kleines Testprogramm
    ;;Tiny2313 als empfänger
    ;;Empfängt ein Byte und gibt dieses via usart aus
    ;;USI als SPI Master
    ;;interruptausgang von RFM an INT0
    ;;SPI standartverdrahtung
    ;;
    .list
    .include "tn2313def.inc"
    
    .nolist
    .equ XTAL=1000000
    .equ t5ms = ( XTAL * 5 / 606 ) / 1000
    
    .def temp1=r16
    .def temp2=r17
    .def temp3=r18
    .def data=r19
    .def lsb=r21
    .def msb=r22
    .def datain=r23
    .def counter=r20
    
    .equ spiddr=ddrb
    .equ spiport=portb
    .equ nsel=0
    
    .org 0x0000
    rjmp start
    .org 0x0001
        rjmp Ext0_int_handle
        reti
        reti
        reti
        reti
    .org 0x0006
        rjmp Timer0OFL
        reti
        reti
        reti
        reti
    
    start:
    ldi temp1, low(ramend)
    out spl, temp1                            ;Stackpointer init
    
    rcall initrs232
    rcall hallo
    rjmp loop                          ;kannst auch weg lassen
    
    loop:
    mov data, lsb
    sleep
    cp data, lsb
    breq loop
    mov temp1, lsb
    rcall seroutdez
    rjmp loop
    
    hallo:
    ldi temp1, 'O'
    rcall serout
    ldi temp1, 'K'
    rcall serout
    ldi temp1, ' '
    rcall serout
    ldi temp1, 'R'
    rcall serout
    ldi temp1, 'S'
    rcall serout
    ldi temp1, ' '
    rcall serout
    ldi temp1, '2'
    rcall serout
    ldi temp1, '3'
    rcall serout
    ldi temp1, '2'
    rcall serout
    ret
    
    ;******************************************************************
    ;RS232 Routine
    ;******************************************************************
    initrs232:
    .equ takt = 1000000 ; 16/8 MHz Systemtakt
    .equ baud =2400    ; Baudrate
    .equ ubrr_val = ((takt+baud*8)/(baud*16)-1)    ; clever Runden
    .equ baud_real = (takt/(16*(ubrr_val+1)))    ; tatsächliche Baudrate
    .equ baud_error = ((baud_real*1000)/baud-1000)    ; Fahler in Promille
    ;
    ;
    .if ((baud_error> 10) || (baud_error <-10))        ; max +/- 10 Promill Fehler
        .error "Systematischer Fehler der Baudrate größer als 1 Prozent und damit zu hoch!"
    .else
        .message "Systematischer Fehler der Baudrate hält sich in Grenzen - OK!"
    .endif
    rcall serinit
    ret
    
    serout:
        sbis ucsra,udre                    ; udre-bit ist gesetzt, wenn der Sendepuffer leer ist
                                        ; UART Data Register Empty
        rjmp serout
        out     udr, temp1                    ; Zeichen senden
        ret                                ; zurück aus der Subroutine
    
        ; Zeichen über RS232 einlesen
        ; temp1: gibt das Zeichen zurück 
    serin:
        sbis ucsra, rxc    
        rjmp serin                        ; wir warten bis ein Byte angekommen ist
    
        in temp1, udr                    ; Zeichen einlesen
        ;rcall serout                    ; und zurücksenden    
        ret
    
    serinit:
        ; Baudrate für RS232 einstellen
        ldi temp1, high(ubrr_val)        ; zuerst Baudrate Highbyte (davon Lownibble)
        out ubrrh, temp1
        ldi temp1, low(ubrr_val)            ; Lowbyte schreiben und prescaler damit triggern
        out ubrrl, temp1
    
        ; frameformat setzen
        ldi temp1, (1<<ucsz1) | (1<<ucsz0)    ; ucsz2:0 = 0 1 1 -> 8 Bit Daten, kein Parity, 1 Stopbit
        out ucsrc, temp1
    
        ; Transmitter einschalten, PortD Bit1 wird überschrieben
        sbi ucsrb, txen                    ; TXE-Bit (3) setzen
        
        ; Receiver einschalten, PortD Bit0 wird überschrieben
        sbi ucsrb, rxen                    ; RXE-Bit (4) setzen
        ;sbi ucsrb, rxcie                ; RXCIE-bit (7) setzen, damit ein irq ausgelöst werden kann, wenn ein Zeichen da ist
        ret
    
    
    
    seroutdez:
               push  temp1            ; die Funktion verändert temp1 und temp2,
               push  temp2            ; also sichern wir den Inhalt, um ihn am Ende
                                      ; wieder herstellen zu können
    
               mov   temp2, temp1     ; das Register temp1 frei machen
                                      ; abzählen wieviele Hunderter
                                      ; in der Zahl enthalten sind
    ;** Hunderter ** 
               ldi   temp1, '0'-1     ; temp1 mit ASCII '0'-1 vorladen
    number_1:
               inc   temp1            ; ASCII erhöhen (somit ist nach dem ersten
                                      ; Durchlauf eine '0' in temp1)
               subi  temp2, 100       ; 100 abziehen
               brcc  number_1     ; ist dadurch kein Unterlauf entstanden?
                                      ; nein, dann zurück zu lcd_number_1
               subi  temp2, -100      ; 100 wieder dazuzählen, da die
                                      ; vorherhgehende Schleife 100 zuviel
                                      ; abgezogen hat
                cpi temp1, 0            ;Führende null weg
                breq number_2
               rcall serout        ; die Hunderterstelle ausgeben
    
    ;** Zehner  **
               ldi   temp1, '0'-1     ; temp1 mit ASCII '0'-1 vorladen
    number_2:
               inc   temp1            ; ASCII erhöhen (somit ist nach dem ersten
                                      ; Durchlauf eine '0' in temp1)
               subi  temp2, 10        ; 10 abziehen
               brcc  number_2     ; ist dadurch kein Unterlauf enstanden?
                                      ; nein, dann zurück zu lcd_number_2
               subi  temp2, -10       ; 10 wieder dazuzählen, da die
                                      ; vorherhgehende Schleife 10 zuviel
                                      ; abgezogen hat
                cpi temp1, 0            ;Führende null weg
                breq number_3
               rcall serout        ; die Zehnerstelle ausgeben
     
    ;** Einer **        
    number_3:
               ldi   temp1, '0'       ; die Zahl in temp2 ist jetzt im Bereich
               add   temp1, temp2     ; 0 bis 9. Einfach nur den ASCII Code für
               rcall serout         ; '0' dazu addieren und wir erhalten dierekt
                                      ; den ASCII Code für die Ziffer
               pop   temp2            ; den gesicherten Inhalt von temp2 und temp1
               pop   temp1            ; wieder herstellen
               ret                    ; und zurück
    
    
    int0_init:
            ldi temp1,(1<<ISC01)|(0<<ISC00)
            out mcucr,temp1
            ldi temp1, (1<<INT0)
            out GIMSK,temp1
            ret
    
    inittimer0:
            sbr temp1, TOIE0
            out TIMSK, temp1
            ldi temp1,0b00000111    ;max prescaler...bei 1mhz 255*1024=262144 takte
                                    ; was bei 1 mhz 1/4sek ist
            out TCCR0B, temp1
            ret
    ;****************************************************************
    ;INTERRUPTHANDLERS
    ;****************************************************************
    Ext0_int_handle:
    ;;Daten stehen bereit
    ;;Auslesen
    rcall read_byte
    reti
    
    Timer0OFL:
    inc counter
    cpi counter, 229
    brne schlafen
    cpi counter, 229
    breq wach
    reti
    
    schlafen:
    sleep
    ret
    wach:
    clr counter
    ret
    
    .include "stddelay.inc"
    mal versucht den Code so zu ändern das der Ablauf einigermaßen erkennbar ist, wann von wo nach wo und zurück gesprungen wird.
    Zusätzlich die Hardware geprüft ?? Also damit mein ich hast du mal tiny2313 und PC verbunden zum testen ? TX und RX geprüft ? Nicht das du die beiden 1:1 gesteckt hast richtig ist TX-RX / RX-TX.

    geb dir mal den Hinweis hier rauf https://www.roboternetz.de/community...313-Bibliothek

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    21.08.2010
    Beiträge
    36
    wir sind nun auf makerconnect.com schon eine Weile mit dem Kampf beschäftigt. Der thread dort heißt RFM12b an tiny44 via USI. Es wurde versucht per soft SPI zu lösen per mega8-hardware SPI. Leider hat nun bis jetzt nichts den durchbruch gebracht. Ich weis auch nicht ob meine init stimmt. Ich poste hier gerne noch mal den aktuellen stand der routine. Deinen Link habe ich mir soeben angesehen. Sehr ausführlich Dokumentierte Arbeit. Wenn es dir nichts ausmacht würde ich sie sehr gerne verwenden, dar so viele nütziche und zeitsparende inits darin integriert sind.
    Ein Frohes Fest und einen guten rutsch ins neue jahr.
    Angehängte Dateien Angehängte Dateien

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied Avatar von avr_racer
    Registriert seit
    01.04.2014
    Ort
    MecklenburgVorpommern
    Beiträge
    175
    Dafür ist solch Bibliothek da Bild  

    Aber mach mal bitte ein Schaltplan wo der RFM 12B (AVRxyz) genau dranhängt mit wem dieser AVR kommuniziert(Schnittstelle) und der AVR welcher per UART und LCD was ausgebn soll

    Danke wünsche ich ebensfalls Frohe Weihnachten und ein guten Rutsch.
    Geändert von avr_racer (24.12.2016 um 11:02 Uhr)

Ähnliche Themen

  1. RN-MikroFunk - Fertiges Projekt eines Miniaturboards inkl Funkmodul RFM12b
    Von Frank im Forum Eigene fertige Schaltungen und Bauanleitungen
    Antworten: 16
    Letzter Beitrag: 22.06.2016, 16:28
  2. Programmierung von RFM12b mit RN-MikroFunk
    Von Roboternetz-News im Forum Neuigkeiten / Technik-News / Nachrichten / Aktuelles
    Antworten: 0
    Letzter Beitrag: 18.12.2015, 17:50
  3. Arduino mit Rfm12b empfängt nicht
    Von Der Einsteiger im Forum Arduino -Plattform
    Antworten: 0
    Letzter Beitrag: 28.07.2015, 14:00
  4. Bascom Funksteckdosen mit RN AVR-Universal (und RFM12b) ansteuern
    Von Frank im Forum Bascom / C / ASM / Sketch / Codesammlung / Programmschnipsel
    Antworten: 0
    Letzter Beitrag: 18.01.2013, 16:33
  5. Rfm12B und Xmega128A3
    Von ChRiZ im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 22.03.2011, 08:09

Berechtigungen

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

    Werbung      Labornetzteil AliExpress