prostych programów do sterowania dioda LED z portu szeregowego

0
void 
UART_init(void)
{

UBRR=(unsigned char) UART_CONST; // ustaw predkosc transmisji
_UCR_ = _BV(RXEN)|_BV(TXEN); // załacz tx, rx

}

// wysyła znak podany jako parametr na port szeregowy

void 
UART_putchar(char c)
{

UDR1 = c; // wpisz c do rejestru UDR
loop_until_bit_is_set(_USR_,TXC); // czekaj na zakonczenie transmisji
sbi(_USR_,TXC); // ustaw bit TXC w rej.USR

}

// odbiera znak z portu szeregowego i zwraca go jako wartosc funkcji

char 
UART_getchar(void)
{

loop_until_bit_is_set(_USR_,RXC); // czekaj na zakonczenie odbioru
cbi(_USR_,RXC); // skasuj bit RXC w rej.USR
return UDR1; // zwróc zawartosc rejestruUDR

}


int 
main(void) // program główny
{

		UART_init =(); // inicjalizacja portu szeregowego
		sbi(LED_PORT_D,LED_BIT_1); // uzyj linii jako wyjscia


		while (1) // petla nieskonczona
		{

				cbi(LED_PORT_O,LED_BIT_1); // zapal diode LED
				UART_putchar('1'); // wyslij '1' na port szeregowy
				ART_getchar(); // czekaj na znak z portu szeregowego
				sbi(LED_PORT_O,LED_BIT_1);// zgas diode LED
				UART_putchar('0'); // wyslij '0' na port szeregowy
				UART_getchar(); // czekaj na znak z portu szeregowego
		}
		
}

ledrs232.c: In function 'UART_init':
ledrs232.c error: expected expression before '=' token
ledrs232.c error: expected expression before '=' token
ledrs232.c error: expected expression before ')' token
ledrs232.c: In function 'UART_putchar':
ledrs232.c error: expected expression before '=' token
ledrs232.c error: expected expression before ')' token
ledrs232.c error: expected expression before ',' token
ledrs232.c warning: left-hand operand of comma expression has no effect
ledrs232.c: In function 'UART_getchar':
ledrs232.c error: expected expression before ')' token
ledrs232.c error: expected expression before ',' token
ledrs232.c warning: left-hand operand of comma expression has no effect
ledrs232.c warning: 'return' with no value, in function returning non-void
ledrs232.c: In function 'main':
ledrs232.c error: expected expression before ')' token
ledrs232.c error: expected expression before ')' token
ledrs232.c warning: left-hand operand of comma expression has no effect
ledrs232.c warning: statement with no effect
ledrs232.c error: expected expression before ',' token
ledrs232.c warning: left-hand operand of comma expression has no effect
ledrs232.c warning: statement with no effect
ledrs232.c error: expected expression before ')' token
ledrs232.c error: expected expression before ',' token
ledrs232.c warning: left-hand operand of comma expression has no effect
ledrs232.c warning: statement with no effect
make.exe: *** [ledrs232.o] Error 1

proszę o pomoc.

jestem początkującym programistą, samouczkiem i przerosło mnie to :D

2

Problemy zaczynają się od linii 61 a tu jest tylko 54

0

tak wyglada caly kod

     #include <avr/io.h> // dostep do rejestrów
     #include <util/delay.h>
     #define F_CPU 8000000ul // czestotliwosc zegara w Hz
     #define UART_BAUD 19200ul // predkosc transmisji bit/s
     #define LED_PORT PORTD // port diody LED
     #define LED_BIT_1 4 // bit diody LED
     #define DDR(x) _SFR_IO8(_SFR_IO_ADDR(x)-1) // adr. rej. kier. PORTx
     #define PIN(x) _SFR_IO8(_SFR_IO_ADDR(x)-2) // adr. rej. wej. PORTx
     #define LED_PORT_O LED_PORT // rejestr wyjsciowy
     #define LED_PORT_D DDR(LED_PORT) // rejestr kierunkowy 27
     #define LED_PORT_I PIN(LED_PORT) // rejestr wejsciowy
     #define UART_CONST (F_CPU/(16ul*UART_BAUD)-1) 
     #define UDR1
     #define _UCR_
     #define _USR_
     #define UBRR
     #define TXC
     #define RXC
     #define TXEN
     #define cbi
     #define sbi
     #define PORTD
     #define ART_getchar
    // _UCR_

    #ifdef UCR
    #define _UCR_ UCR
    #endif

    #ifdef UCSR1B
    #define _UCR_ UCSR1B
    #endif

    #ifdef UCSR0B
    #define _UCR_ UCSR0B
    #endif 

    // _USR_

    #ifdef USR
    #define _USR_ USR
    #endif

    #ifdef UCSRA0
    #define _USR_ UCSRA0
    #endif

    #ifdef UCSR0A
    #define _USR_ UCSR0A
    #endif 

      // Definicje funkcji
      // inicjalizacja portu szeregowego

      void 
      UART_init(void)
      {

      UBRR=(unsigned char) UART_CONST; // ustaw predkosc transmisji
      _UCR_ = _BV(RXEN)|_BV(TXEN); // załacz tx, rx

      }

      // wysyła znak podany jako parametr na port szeregowy

      void 
      UART_putchar(char c)
      {

    UDR1 = c; // wpisz c do rejestru UDR
    loop_until_bit_is_set(_USR_,TXC); // czekaj na zakonczenie transmisji
    sbi(_USR_,TXC); // ustaw bit TXC w rej.USR

      }

    // odbiera znak z portu szeregowego i zwraca go jako wartosc funkcji

    char 
    UART_getchar(void)
    {

    loop_until_bit_is_set(_USR_,RXC); // czekaj na zakonczenie odbioru
    cbi(_USR_,RXC); // skasuj bit RXC w rej.USR
    return UDR1; // zwróc zawartosc rejestruUDR

    }


    int 
    main(void) // program główny
    {

		UART_init =(); // inicjalizacja portu szeregowego
		sbi(LED_PORT_D,LED_BIT_1); // uzyj linii jako wyjscia


		while (1) // petla nieskonczona
		{

				cbi(LED_PORT_O,LED_BIT_1); // zapal diode LED
				UART_putchar('1'); // wyslij '1' na port szeregowy
				ART_getchar(); // czekaj na znak z portu szeregowego
				sbi(LED_PORT_O,LED_BIT_1);// zgas diode LED
				UART_putchar('0'); // wyslij '0' na port szeregowy
				UART_getchar(); // czekaj na znak z portu szeregowego
		}
		
    }

0

ale widze ze tutaj jakos inaczej policzylo linijki niz u mnie w notepad.. problem.png

0

Po co to?

#define UBRR
0

bez tego wyskakuje od razu ledrs232.c error: 'UBRR' undeclared (first use in this function)

4

No tak, ale dlaczego akurat #define UBRR (tzn. dlaczego robisz define na pustą wartość)?

Zauważ, że taki define powoduje zamianę:

UBRR=(unsigned char) UART_CONST;

... w:

=(unsigned char) UART_CONST;

... i stąd (między innymi) Twój problem.

Tak luźno strzelając, powinieneś chyba ustawiać UBRRL i UBRRH.

0

ok usunąłem tą wartość i mam teraz

ledrs232.c error: 'UBRR' undeclared (first use in this function)
ledrs232.c error: (Each undeclared identifier is reported only once
ledrs232.c error: for each function it appears in.)
ledrs232.c error: expected expression before '=' token
ledrs232.c error: expected expression before ')' token

1

Oke, powoli, dlaczego w ogóle uważasz, że powinieneś robić akurat UBRR = cośtamcośtam; - robisz to zgodnie z jakimś poradnikiem? 👀

3

Zacznij może od jakiegoś kursu "normalnego" C dla początkujących....

C w systemach wbudowanych to wyjątkowo mało intuicyjna działka i jak nie będziesz miał pewnych podstaw to metodą prób i błędów wiele nie zdziałasz...

Na AVR nazwy rejestrów zależą od tego jaki masz procek
Nie wiem czy to działa i czy Ci to pomoże, ale poczytaj:
link
link

2
S4t napisał(a):

Problemy zaczynają się od linii 61 a tu jest tylko 54

Problemy zaczynają się od samego tytułu watku

Bartłomiej Golenko napisał(a):

Zacznij może od jakiegoś kursu "normalnego" C dla początkujących....

+1

Ale mikroprocesorowcy elektrodowcy są uczuleni na naukę języka. Parzy ich czy coś takiego

6

Przy kompilacji masz ustawiony procesor "attiny13".
Ten procesor nie posiada czegoś takiego jak UART.

Zmień procesor, lub ustawienia kompilacji, w zależności jaki procesor masz fizycznie.

4

Jako, że jesteś początkującym skoro nie możesz poradzić sobie z kompilacją, to ja ci pokażę znacznie łatwiejszy w czytaniu kod, który robi to samo co to wyżej.
Arduino framework.

#include <Arduino.h>

#define LED LED_BUILTIN

void setup()
{
  pinMode(LED, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  if (Serial.available() > 0)
  {
    switch (Serial.read())
    {
    case '0':
      Serial.println("Off");
      digitalWrite(LED, LOW);
      break;

    case '1':
      Serial.println("ON");
      digitalWrite(LED, HIGH);
      break;

    default:
      break;
    }
  }
}

Tam za pomocą cbi, sbi ustawiasz bity, a tu za pomocą digitalWrite.
Dużo bardziej czytelne, niż clear bit i set bit, tutaj ustawiasz i czyścisz bit za pomocą HIGH i LOW.

I teraz jak w serial monitorze naciśniesz 0, to zgasisz diodę, a jak 1 to zapalisz.

#define LED <NR> w miejsce <NR> podajesz nr portu, pod który podczepiłeś diodę, port digital, musisz sprawdzić na swoim mikrokontrolerze jakie ma wyjścia np. dla arduino uno: https://miro.medium.com/max/700/0*p2M6WXvU4wKuWuTZ
np. PD4 lub liczba 4, jeśli pod tego podpiełeś diodę z rezystorem, z portu nie można więcej niż 20mA prądu ciągnąć, więc dioda red + 220ohm rezystor będzie w sam raz.

Jak nauczysz się wysokopoziomowo programować uC to potem możesz ręcznie w rejestrach bity ustawiać, ale wtedy musisz już otworzyć dokumentację danego mikrokontrolera.
Np. dla ATmega328P masz: https://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf

1 użytkowników online, w tym zalogowanych: 0, gości: 1