Autor: Dondu
Artykuł jest fragmentem cyklu: Pułapki mikrokontrolerów AVR
Każdy rejestr ma swój adres w przestrzeni adresowej mikrokontrolera. Możesz to zobaczyć w tabeli Register Summary w datasheet Twojego AVR-a.
Ale są wyjątki ! Takim wyjątkiem są rejestry UCSRC i UBRRH. Znajdują się one bowiem pod jednym i tym samym adresem 0x20:
Na tę pułapkę nadział się prawie każdy początkujący:
davidpi
ATMega 8 USART Prędkość wysyłania, czemu tak wolno? ... Z jaką ja prędkością to w końcu wysyłam?? Czy na pewno 9600bps czy może coś pokręciłem?
ATMega 8 USART Prędkość wysyłania, czemu tak wolno? ... Z jaką ja prędkością to w końcu wysyłam?? Czy na pewno 9600bps czy może coś pokręciłem?
Jak to możliwe, że dwa rejsetry są pod tym samym adresem?
Oczywiście bez pewnego tricku, nie może być dwóch rejestrów pod jednym adresem. Zauważ, że oba rejestry mają wspólny jeden bit URSEL, który jest najstarszym bitem (bit 7) obu rejestrów:
Na czym polega trick?
Rolą bitu URSEL jest przełączanie pomiędzy rejestrami UBRRH i UCSRC w czasie ich zapisu lub odczytu adresu 0x20. Jeżeli:
- URSEL = 0 - operujesz na rejestrze UBRRH
- URSEL = 1 - operujesz na rejestrze UCSRC
Dokładny opis jak posługiwać się tymi rejestrami w językach C oraz assembler znajdziesz w datasheet w dziale: Accessing UBRRH/UCSRC Registers.
davidpi
Oki. Już rozumiem o co chodzi z tym bitem URSEL. Musi być ustawiony gdy wpisujemy do UCSRC. Gdy URSEL=0, to wpisujemy do UBRRH. Dzięki za pomoc
Oki. Już rozumiem o co chodzi z tym bitem URSEL. Musi być ustawiony gdy wpisujemy do UCSRC. Gdy URSEL=0, to wpisujemy do UBRRH. Dzięki za pomoc
Zobacz pozostałe pułapki AVR
- Pułapki AVR: Spis treści
Siedziałem nad tym pół niedzieli...:(
OdpowiedzUsuń