Zugriff auf Array

Gast #2295171
Lesenswert?

Hier soll die Baudrate anhand eines DIp Switches eingestellt werden.


#define DIP_SW ~PINC & 0x3F
(DIP_SW entspspricht 5)


Funktioniert:
1
const uint16_t UBRR_VAL[] = { 2303,575,287,143,71,47,35,23,17,11,8,5,2 };
2
UBRRH = UBRR_VAL[5] >> 8;
3
UBRRL = UBRR_VAL[5] & 0xFF;

Funktioniert nicht:
1
UBRRH = UBRR_VAL[DIP_SW] >> 8;
2
UBRRL = UBRR_VAL[DIP_SW] & 0xFF;


Woran liegt das?
Gast #2295189
Lesenswert?

1
#define DIP_SW ~PINC & 0x3F

Um den DIP-Sw einzulesen brauchst du eine Hilfsvariable:
1
#define DIP_SW ~PINC & 0x3F
2

3
const uint16_t UBRR_VAL[] = { 2303,575,287,143,71,47,35,23,17,11,8,5,2 };
4

5
uint8_t u8Dip = DIP_SW;
6

7
UBRRH = (uint8_t) ( UBRR_VAL[u8Dip] >> 8    );
8
UBRRL = (uint8_t) ( UBRR_VAL[u8Dip] &  0xFF );
Gast #2295208
Lesenswert?

auch die hilfsvariable funzt nicht.

Der DIP schalter hängt an Port C. auf on steht hier PINC0 und PINC2
ergibt somit 5. diese 5 Lese ich auch wunderbar per UART aus.

z.B. direkt im uart init:

void myuart_init(void) {


  UBRRH = UBRR_VAL[5] >> 8;

  UBRRL = UBRR_VAL[5] & 0xFF;

  // Enable receiver and transmitter; enable RX interrupt

  UCSRB = (1 << RXEN) | (1 << TXEN) | (1 << RXCIE);

  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0); // Asynchron 8N1

  myuart_putc(DIP_SW);
  <- gibt schön die 5 aus
}

Verwende ich aber:
UBRRH = UBRR_VAL[DIP_SW] >> 8;
UBRRL = UBRR_VAL[DIP_SW] & 0xFF;

oder das Beispiel von lippy wird da eine
240 drauß (0x11110000)

vermutlich weil er da irgendwas falsches einstellt
Gast #2295227
Lesenswert?

UBRRH = UBRR_VAL[5] >> 8;
  UBRRL = UBRR_VAL[5] & 0xFF;
  myuart_putc(UBRRH);
  myuart_putc(UBRRL);

Schreibt den Richtigen wert aus -> 47
1
  uint8_t u8Dip = DIP_SW;
2

3
  myuart_putc(u8Dip);
4
  (gibt auch 5 aus)
5

6
  uint8_t UBRRHX = UBRR_VAL[u8Dip] >> 8;
7
  uint8_t UBRRLX = UBRR_VAL[u8Dip] & 0xFF;
8

9
  myuart_putc(UBRRHX);
10
 (gibt 255 aus)
11

12

13
  myuart_putc(UBRRLX);
14
 (gibt 255 aus)
Gast #2295250
Lesenswert?

1
  myuart_putc(u8Dip);
2
  (gibt auch 5 aus)
3

4
  uint8_t UBRRHX = UBRR_VAL[u8Dip] >> 8;
5
  uint8_t UBRRLX = UBRR_VAL[u8Dip] & 0xFF;
6

7
  myuart_putc(UBRRHX);
8
 (gibt 255 aus)
9

10

11
  myuart_putc(UBRRLX);
12
 (gibt 255 aus)

Was mich hier wundert:
Die Veränderung von UBRRHx wirkt sich doch sofort aus. Also ist die 
"empfangene" 255 nicht sicher. Es kann auch ein falsch eingestellter 
Empfänger sein. Ich würde mir das mal mit dem Oszi ansehen.
Gast #2295272
Lesenswert?

Makefile:

PROJECT=uart-tester
SOURCES=myuart.c uart-tester.c
CC=avr-gcc
OBJCOPY=avr-objcopy
MMCU=atmega8

# --------------------- CFLAGS
CFLAGS=-mmcu=$(MMCU) -Wall
CFLAGS += -Wall -gdwarf-2 -Os -std=gnu99 -funsigned-char 
-funsigned-bitfields -fpack-struct -fshort-enums -DF_CPU=11059200UL

$(PROJECT).hex: $(PROJECT).out
  $(OBJCOPY) -j .text -O ihex $(PROJECT).out $(PROJECT).hex


$(PROJECT).out: $(SOURCES)
  $(CC) $(CFLAGS) -I./ -o $(PROJECT).out $(SOURCES)
#2295275
Lesenswert?

Simon schrieb:
> also ein progmem ist nicht im spiel, irgendwie bin ich bisle ratlos.

Das sind alle anderen auch, wenn du nur stückweise Infos lieferst.
Wie soll da jemand helfen?

Ist es so schwer, ein vollständiges Programm, einen Schaltplan und 
wenigstens den verwendeten PRozessor zu verraten?

Man hat ja auch noch anderes vor im Leben als nur herumzuraten.
#2295276
Lesenswert?

Matthias Lipinsky schrieb:
> Stefan Ernst schrieb:
>> Matthias Lipinsky schrieb:
>>> Die Veränderung von UBRRHx wirkt sich doch sofort aus.
>>
>> Nö, das sind doch nur zwei Hilfsvariablen, nicht die UARRT-Register.
>
> Woran erkennst Du das?
1
uint8_t UBRRHX = UBRR_VAL[u8Dip] >> 8;
Erstens ist das explizit eine Variablendeklaration, und zweitens heißt 
das Register anders (UBRRH nicht UBRRHX).
Gast #2295301
Lesenswert?

exakt das wars!!
Danke an alle!

selbst das hier funzt nun:

UBRRH = UBRR_VAL[DIP_SW] >> 8;

UBRRL = UBRR_VAL[DIP_SW] & 0xFF;
1
$(OBJCOPY) -j .text -j .data -O ihex $(PROJECT).out $(PROJECT).hex

Zum Verständnis.. woher hast du das gewusst das sich das
so äussert?!

Also das es an der Fehlenden .data section lag?
#2295316
Lesenswert?

Simon schrieb:
> Also das es an der Fehlenden .data section lag?

Hier
1
  myuart_putc(u8Dip);
2
  (gibt auch 5 aus)
3

4
  uint8_t UBRRHX = UBRR_VAL[u8Dip] >> 8;
5
  uint8_t UBRRLX = UBRR_VAL[u8Dip] & 0xFF;
6

7
  myuart_putc(UBRRHX);
8
 (gibt 255 aus)
9

10
  myuart_putc(UBRRLX);
11
 (gibt 255 aus)
ist zu sehen, dass das Array nicht mit den korrekten Werten 
initialisiert ist. Und diese Initialisierungswerte liegen nun mal in der 
.data-Section.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren