AtMega128 Problémák C ben

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
Avatar
gab3310
Újonc
Újonc
Hozzászólások: 2
Csatlakozott: 2010. július 10. szombat, 6:00

AtMega128 Problémák C ben

Hozzászólás Szerző: gab3310 »

Sziasztok!

Több kérdésem is lenne, mert már egyszerűen nem tudom mi lehet a baj (bár elgondolkodtam már hogy a GCC-vel van bajom)
Először is az a nagy gondom hogy a deklarált változók nem igazán akarnak működni a csipen. Teljesen rapszodikus a fordítás, ha egy szubrutint megírok a változók nem igazán akarnak átadódni, vagy csak 1-2. Ha a Main részbe teszem azok működnek de az utasítások viszont nem. Ez teljesen érthetetlen számomra már.
Másodszor UART1- est a világ minden kincséért sem tudom életre kelteni. Pedig az UART0-án működik. Ez miért lehet?? Már cseréltem procit is de mindegyikkel ezt műveli.
Ha esetleg valaki már találkozott hasonló jelenséggel nagyon megköszönném kioktatásom. Mert már kezdem feladni szenvedésem.
AVR-Studiot használok WinAVR20100110-sel
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Ha esetleg láthatnánk 1 minta programot.
Jó sok magyarázó megjegyzéssel, és hibajelzéssel!
Lehet, még értenénk is a kérdést!
:cry: :!:
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Esetleg itt, ha még nem olvastad.
Egyszerű soros kommunikáció AVR-rel (UART)
http://www.hobbielektronika.hu/kapcsola ... .html?pg=1
:wink:

Kód: Egész kijelölése

/*
UART1 hasznalata polling modszerrel
Hardver:    ATmega128 @ 7.372800MHz
PC Szoftver: Hyper terminal @ 9600 baud, Nincs Paritas Bit, 2 Stop Bit, Flow Control = NONE
*/
 
#define F_CPU 7372800UL // rendszer orajel: 7.3728 MHz
#define USART_BAUDRATE 9600 // soros kommunikacio sebessege: 9600 bps
#define BAUD1 ((F_CPU / (USART_BAUDRATE * 16UL)) - 1) // UBRR1
 
#include <avr/io.h>
#include <inttypes.h>
 
void USART1_Init( unsigned int baud )
{
/* Set baud rate */
UBRR1H = (unsigned char)(baud>>8);
UBRR1L = (unsigned char)baud;
/* Enable receiver and transmitter */
UCSR1B = (1<<RXEN1)|(1<<TXEN1);
/* Set frame format: 8data, 2stop bit */
UCSR1C = (1<<USBS1)|(3<<UCSZ10);
}

void USART1_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSR1A & (1<<UDRE1)) )
;
/* Put data into buffer, sends the data */
UDR1 = data;
}



unsigned char USART1_Receive( void )
{
/* Wait for data to be received */
while ( !(UCSR1A & (1<<RXC1)) )
;
/* Get and return received data from buffer */
return UDR1;
}

int main(void) // Foprogram
{
          char data;
 
          USART1_Init(BAUD1);  // UART Konfiguralasa
 
          while(1) // Vegtelen ciklus
          {
             data=USART1_Receive();  // A berekezo bajt fogadasa
             // A beerkezett karaktert szogletes zarojelben kuldjuk vissza
             USART1_Transmit('[');
			 USART1_Transmit(data);
             USART1_Transmit(']');
          }
}
Nem teszteltem!
8)
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2011. január 28. péntek, 10:44-kor.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Biztosítékbiteknél kivetted, hogy ne mega103 módban működjön?
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Hogy én naiv menyit dolgoztam a fenti kis rutinon!
(Be kellet kézzel írni 1 halom 1-est az adatlapi példába! -:)
Utána itt megtaláltam az egészet. Még hiba ellenőrzés is van benne.

http://homepage.hispeed.ch/peterfleury/ ... tware.html
UART library-ban
Minden trükköt elleshetsz! Még némi hibakezelés is van benne.
+ pár hasznos lib-et találsz példákkal.

Ezért jó a C++ mert a tucat feladatokat már elkészítették mások.
Csak adaptálni kel őket. Feltéve, ha megtalálod!


Szintaktikai hibákban csak úgy segíthetünk ha látjuk!
:lol:
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2011. január 28. péntek, 11:42-kor.
Avatar
gab3310
Újonc
Újonc
Hozzászólások: 2
Csatlakozott: 2010. július 10. szombat, 6:00

Hozzászólás Szerző: gab3310 »

Nagyon szépen köszönöm segítségeteket.
Még az este reá jöttem balgaságomra. Tényleg M103C be volt kapcsolva.
A változó mizzériára is rá jöttem.
A AvrStudio kikapcsolta nekem a Stack kezelést.

Most már mükszik.

Am ez volt a progi mi miatt szenvedtem:

static int U1TxD(char c ,FILE *stream) {
PORTD |= (1<<TxE);
PORTC |= (1<<LD2);
while (!(UCSR1A&(1<<UDRE)));
UDR1 = c;
while (!(UCSR1A&(1<<UDRE)));
PORTD &=0xfc;
PORTC &=0x7f;
return 0;
}

void UART1_INIT(void){
UBRR1L = 25;
UBRR1H = 0;
UCSR1B = (0<<RXEN)|(1<<TXEN);
UCSR1C = (1<<UCSZ1)|(1<<UCSZ0)|(0<<UCPOL);
}

Mégegyszer köszönök mindent.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Mind a 2 olyan hiba amit, Kezdő korában mindenki elkövet legalább 1*!
:wink:
Avatar
atideath
Biztosítékgyilkos
Hozzászólások: 57
Csatlakozott: 2011. július 3. vasárnap, 6:00

Hozzászólás Szerző: atideath »

Mivel nem találtam más topicot és ezért nem szeretnék újat nyitni ezért inkább írom ide a bajomat.

Olyan problémám lenne hogy definiálni szeretnék 1-2 paramétert a program elején hogy utána könnyen tudjam a PIN,DDR,PORT-okat kezelni. Arra nem jöttem rá hogy AVR Studio-ban hogyan tudom ezt megtenni?

Konkrétan IAR-ban egy definíció:

Kód: Egész kijelölése

#define LCD_RST_DDR DDRD_Bit4
#define LCD_RST_PORT PORTD_Bit4
#define LCD_RST_PIN PIND_Bit4
De ugye ezek nem mennek avr-gcc-vel. És oda kellene átpakolnom a programot.

A PIND_Bit4 helyett én PIND4-et írtam ami működik is. De a többire nem bírok rájönni hogy van.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Hozzászólás Szerző: Robert »

Makróval definálni?
Avatar
atideath
Biztosítékgyilkos
Hozzászólások: 57
Csatlakozott: 2011. július 3. vasárnap, 6:00

Hozzászólás Szerző: atideath »

Robert írta:Makróval definálni?
Arra nem tudom a választ hogy hogyan tudok közvetlenül 1 PIN-re, DDR-re, PORT-ra hivatkozni AVR-GCC-ben. BASCOM-ban és IAR-ban tudom hogy lehet. Mivel itt közvetlenül állítja a portokat kimenetnek, bementnek, jelszintjét így nem tudom. A másik elgondolás az volt hogy:

LCD_PORT =(1<<PINC4);

De ezt akarom leegyszerűsíteni hogy az elején definiálja az LCD-t és úgy állítja:

LCD_RST_DDR=1;
LCD_RST_PORT=1;
stb.
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Esetleg lessél bele hogyan definiálják a regisztereket!
C:\Program Files\Atmel\AVR Studio 5.0\avrassembler\include\m128def.inc
Pl.: M128 PortD :

Kód: Egész kijelölése

; ***** PORTD ************************
; PORTD - Port D Data Register
.equ	PORTD0	= 0	; Port D Data Register bit 0
.equ	PD0	= 0	; For compatibility
.equ	PORTD1	= 1	; Port D Data Register bit 1
.equ	PD1	= 1	; For compatibility
.equ	PORTD2	= 2	; Port D Data Register bit 2
.equ	PD2	= 2	; For compatibility
.equ	PORTD3	= 3	; Port D Data Register bit 3
.equ	PD3	= 3	; For compatibility
.equ	PORTD4	= 4	; Port D Data Register bit 4
.equ	PD4	= 4	; For compatibility
.equ	PORTD5	= 5	; Port D Data Register bit 5
.equ	PD5	= 5	; For compatibility
.equ	PORTD6	= 6	; Port D Data Register bit 6
.equ	PD6	= 6	; For compatibility
.equ	PORTD7	= 7	; Port D Data Register bit 7
.equ	PD7	= 7	; For compatibility

; DDRD - Port D Data Direction Register
.equ	DDD0	= 0	; Port D Data Direction Register bit 0
.equ	DDD1	= 1	; Port D Data Direction Register bit 1
.equ	DDD2	= 2	; Port D Data Direction Register bit 2
.equ	DDD3	= 3	; Port D Data Direction Register bit 3
.equ	DDD4	= 4	; Port D Data Direction Register bit 4
.equ	DDD5	= 5	; Port D Data Direction Register bit 5
.equ	DDD6	= 6	; Port D Data Direction Register bit 6
.equ	DDD7	= 7	; Port D Data Direction Register bit 7

; PIND - Port D Input Pins
.equ	PIND0	= 0	; Port D Input Pins bit 0
.equ	PIND1	= 1	; Port D Input Pins bit 1
.equ	PIND2	= 2	; Port D Input Pins bit 2
.equ	PIND3	= 3	; Port D Input Pins bit 3
.equ	PIND4	= 4	; Port D Input Pins bit 4
.equ	PIND5	= 5	; Port D Input Pins bit 5
.equ	PIND6	= 6	; Port D Input Pins bit 6
.equ	PIND7	= 7	; Port D Input Pins bit 7
:wink:

Kód: Egész kijelölése

Vagy	Iom128a.h:
/* Input Pins, Port D */
#define PIND      _SFR_IO8(0x10)

/* Data Direction Register, Port D */
#define DDRD      _SFR_IO8(0x11)

/* Data Register, Port D */
#define PORTD     _SFR_IO8(0x12)


/* Port D Data Register - PORTD */
#define    PD7       7
#define    PD6       6
#define    PD5       5
#define    PD4       4
#define    PD3       3
#define    PD2       2
#define    PD1       1
#define    PD0       0

/* Port D Data Direction Register - DDRD */
#define    DDD7         7
#define    DDD6         6
#define    DDD5         5
#define    DDD4         4
#define    DDD3         3
#define    DDD2         2
#define    DDD1         1
#define    DDD0         0

/* Port D Input Pins - PIND */
#define    PIND7        7
#define    PIND6        6
#define    PIND5        5
#define    PIND4        4
#define    PIND3        3
#define    PIND2        2 
#define    PIND1        1
#define    PIND0        0
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

Hozzászólás Szerző: kapu48 »

Én igy képzelem:

Kód: Egész kijelölése

#define LCD_RST_PORT1 PORTD |= (1<<PD4);
#define LCD_RST_PORT0 PORTD &= ~(1<<PD4);
8)

Ők igy csinálják:

http://www.8051projects.net/e107_files/ ... torial.pdf 24.oldal...
Válasz küldése