AtMega128 Problémák C ben
AtMega128 Problémák C ben
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
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
Esetleg itt, ha még nem olvastad.
Egyszerű soros kommunikáció AVR-rel (UART)
http://www.hobbielektronika.hu/kapcsola ... .html?pg=1
Nem teszteltem!

Egyszerű soros kommunikáció AVR-rel (UART)
http://www.hobbielektronika.hu/kapcsola ... .html?pg=1
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(']');
}
}
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2011. január 28. péntek, 10:44-kor.
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!

(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!
A hozzászólást 1 alkalommal szerkesztették, utoljára kapu48 2011. január 28. péntek, 11:42-kor.
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.
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.
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ó:
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.
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
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.
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:Robert írta:Makróval definálni?
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.
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 :
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
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
Én igy képzelem:

Ők igy csinálják:
http://www.8051projects.net/e107_files/ ... torial.pdf 24.oldal...
Kód: Egész kijelölése
#define LCD_RST_PORT1 PORTD |= (1<<PD4);
#define LCD_RST_PORT0 PORTD &= ~(1<<PD4);
Ők igy csinálják:
http://www.8051projects.net/e107_files/ ... torial.pdf 24.oldal...
