Forum: Mikrocontroller und Digitale Elektronik Wann out und wann sts benutzen?


von Roman (Gast)


Lesenswert?

Hallo zusammen,

bei der Programmierung des MIDI Interfaces für meine Yamaha Orgel, ist 
mir aufgefallen das ich manche Einstellungen mit sts schreiben muss und 
manche mit out. Hier am Beispiel des externen Interuptes.
1
    ; Set EXTINT0
2
    ldi temp, (3<<ISC00)     ; Enable rising edge of INT0
3
    sts EICRA, temp
4
    
5
    ; Enable INT0    
6
    ldi temp, (1<<INT0)    ; Enable INT 0
7
    out EIMSK, temp

Ich verwende den mega88 und habe auch schon gelesen das der erweiterte 
I/O Bereich per in/out erreichbar ist. Welche Addressen sind das beim 
mega88?

Ferner habe ich das Problem das bei der Initialisierung des UART0 das 
einschalten des TX ein kopieren der Daten in UBR0H zur Folge hat.
Das heisst setzen des UCSR0B, danach ist UBRR0H identisch.
1
        ; Set Baudrate 
2
        ldi temp, LOW(UBRRVAL)
3
        sts UBRR0L, temp
4
        ldi temp, HIGH(UBRRVAL)
5
        sts UBRR0H, temp
6
7
        ; Frame-Format: 8 Bit
8
        ldi temp, (1<<UMSEL00)|(3<<UCSZ00)
9
        sts UCSR0C, temp
10
    
11
        ; Enable TX
12
        ldi temp, (1<<TXEN0)
13
        sts UCSR0B,temp

Muss ich hier auch einen anderen Befehl zum setzen des TXEN benutzen? 
Meine Versuche funktionierten alle nicht!

Jeder Rat ist willkommen.

Gruss

Roman

von Johannes M. (johnny-m)


Lesenswert?

Schau mal ins Datenblatt. Am Ende des Datenblatts ist das Register 
Summary. Da kann man sehr schön sehen, welche Register zum normalen und 
welche zum extended I/O-Space gehören. Die Register, bei denen 
zusätzlich zur RAM-Adresse (in Klammern) noch eine Register-Adresse 
angegeben ist (0x00 bis 0x3F) sind per in und out ansprechbar. Alles 
darüber nur über lds und sts.

EDIT: Also alles bis zu dem dicken Strich in der Tabelle oberhalb vom 
SREG ist per in und out ansprechbar...

von Roman (Gast)


Lesenswert?

Danke Johannes,

das ging aber schnell. Somit kann ich also über die m88def.inc festlegen 
ob ich die ASCR Adresse 0x30 mit out oder als 0x50 mit sts ansprechen 
will.

Hast Du eine Idee warum das mit dem setzen des TXEN nicht klappt. Per 
SBI komme ich da ja nicht hin. Also das ganze Register setzen und per 
sts hoch?

Gruss

Roman

von Johannes M. (johnny-m)


Lesenswert?

Bitzugriff mit sbi/cbi (und auch mit den Skip-Befehlen sbis/sbic) geht 
nur für die unteren 32 Register (bis Register-Adresse 0x1F, da wo der 
andere dicke Strich ist). Alles darüber muss komplett geschrieben werden 
(bzw. Read-Modify-Write).

von ecslowhand (Gast)


Lesenswert?

Probiers damit:
1
; ---------------------
2
; UART0 initialisieren
3
; ATMEGA 88
4
; ---------------------
5
USART_init:
6
cli            ; Interrupts sperren
7
ldi  r16, LOW((clock/(16*baudrate))-1)  ; Baudrate berechnen..
8
ldi  r17, HIGH((clock/(16*baudrate))-1)
9
sts  UBRR0L, r16        ; ...und setzen
10
sts  UBRR0H, r17
11
12
lds  r16, UCSR0B
13
sbr  r16, (1<<RXCIE0)      ; RX-Interrupt enable
14
sbr  r16, (1<<RXEN0)|(1<<TXEN0)
15
cbr  r16, (1<<UCSZ02)      ; 8 datenbits
16
sts  UCSR0B, r16
17
18
lds  r16, UCSR0C
19
cbr  r16, (1<<UCPOL0)      ; asyncron
20
cbr  r16, (1<<UMSEL01)|(1<<UMSEL00)    
21
cbr  r16, (1<<UPM01)|(1<<UPM00)    ; no parity
22
cbr  r16, (1<<USBS0)        ; 1 stopp-bit
23
cbr  r16, (1<<UCSZ02)      ; 8 datenbits
24
sbr  r16, (1<<UCSZ01)|(1<<UCSZ00)
25
sts  UCSR0C, r16


LG EC

von ecslowhand (Gast)


Lesenswert?

Sorry, die Zeile für das UCSR0C-Register ist zu löschen !
1
cbr  r16, (1<<UCSZ02)      ; 8 datenbits

  

von Axel R. (Gast)


Lesenswert?


von Roman (Gast)


Lesenswert?

Danke an alle für die vielen Antworten. Vor allen Dingen die Macros 
scheinen Spitze zu sein, wenn ich sie denn dann verstanden habe ;-).

read-modify-write wie Johannes schon ausführte, allerdings ohne Stress 
wo steht das Register.

Danke und Gruss

Roman

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.