PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : GCC - I/O problem + Tastatur - Blackout



mirki
02.01.2005, 16:44
Hallo,

frohes und erfolgreiches neue Jahr euch allen.

Ich weiss, viele von euch werden jetzt sagen : "Google doch mal, such im Forum usw". Ich gebe euch allen recht. Aber ich habe gerade einen Blackout. Habe auch gegoogelt und im Forum nachgeschaut, es waren zwar teilweise ein paar nützliche Sachen dabei aber z.Zt bin ich einfach zu Blöd es in meine Umgebung zu implementieren.

Ich hoffe ihr könntet mir trotzdem helfen !! :-(

Ich habe einen ATmega8515 mit 12MHz, da hängt ein MAX232 für Ausgabe auf dem PC, und ein ISP mit dem 75HCT244N für die ISP. Habe alles selber zusammen gebaut. Zudem habe ich einen Application Boad mit LED's und Tastern gebaut.

Das was ich bis jetzt hinbekomme ist ein Lauflicht und die Ausgabe zum PC. Zudem habe iech auch einige Eventhandler für die externen Interuppts ( für LED an und ausgabe auf PC wenn Interrupt ausgelöst wurde ).

Mein Ziel ist es eine PC-Tastatur am mega8515 anzuschliessen und die eingaben mit dem UARt an den PC weiter zu leiten. Wie gesagt, es ist nur ein Ziel. Um dieses Ziel zu erreichen habe ich die AVR313 gefunden, kann sie aber nicht mit dem Winavr ( GCC ) kompilieren.

Bevor ich aber damit anfange möchte ich etwas ganz einfaches machen, ich möchte, dass wenn man einen taste drückt dann eine LED angeht.

Wie gesagt mit den Interuppt habe ich es geschafft, aber nicht wenn der Taster an einen PIN der Ports hängt.


Wäre sehr hilfreich wenn mir jemand einen code für denn gcc geben würde der folgendes macht :

PORTC auf Ausgang schalten und LED's auschalten.
PORTA auf Eingang schalten oder besser BIT0 von PORTA.
Wenn BIT0 von PORTA = 1 dann BIT0 von PORTC auf 0 ( LED's sind gegen GND geschaltet ).

Endloasschleife plus ausschaltfunktion wären noch besser.

Danke für den Code im vorraus.



Was die Tastatur angeht, der CLK ist am INT0 drann und DATA an PORTA BIT1.

Falls jemand was hat wo mir einfach nur das byteword ab den Startbit und dem StopBit aus der tastatur auf die LED's am PORTC ausgegeben wird reicht mir schon, den rest würde ich selber hinbekommen ( =denke ich ).


Vielen Dank im vorraus !!
Ihr könntet mir hier sehr helfen !

LG
mirki

Thorsten
02.01.2005, 21:52
Hi,

ich schreib mal drauflos:





#include <avr/io.h>

void main(void)
{
DDRC = 0xFF; // PortC als Ausgang
PORTC = 0xFF; // Leds aus (Ausgänge auf Logisch 1)

DDRA = 0x00; // Port A als Eingang
// DDRA = 0xFE; // Nut bit0 als Eingang

while(1) // Endlosschleife
{
if ( bit_is_set( PINA, 0)) // Wenn PA0 == 1...
cbi( PORTC, 0); // ... dann PC0 = 0
else // Wenn nicht...
sbi( PORTC, 0); // ...PC0 = 1
}
}


Ich habs selber nicht getestet, versuch mal obs funktioniert.


Thorsten

mirki
02.01.2005, 22:44
Danke Thorsten,

hab selber auch schon was gemacht ( aus dem Blackout wurde ein whitein) :-)


#include <avr/io.h>
#include <stdlib.h>


#define ms 10
#define SYSCLK 12000000


int
uart_putchar(char c)
{
if (c == '\n')
uart_putchar('\r');
loop_until_bit_is_set(UCSRA, UDRE);
UDR = c;
return 0;
}


void
uart_puts(const char *s)
{
char c;

while ((c = *s++) != '\0')
uart_putchar(c);
}



int init_usart(void)
{
UBRRL=78; // bei 12MHz
outp(_BV(TXEN),UCSRB);

}


int usartprintnl(void) /* print new line */
{
while (! (UCSRA & _BV(UDRE)) )
;
UDR = 10; /* LF */
while (! (UCSRA & _BV(UDRE)) )
;
UDR = 13; /* CR */

return 2;

}

int usartprintcr(void)
{
while (! (UCSRA & _BV(UDRE)) )
;
UDR = 13; /* CR */

return 2;
}


int usartprint(int buf)
{
int i;

//for (i=0;i<8;i++) {
/* if the UDRE bit is set this means that the UDR buffer is
* empty. New data can be transmitted */
while ( !(UCSRA & _BV(UDRE)) )
;

UDR = buf;
//}


}



void wait(unsigned int multiplier50us) {
unsigned int i;

for(i=0;i<multiplier50us;i++) {
asm volatile(
"ldi r16, 125" "\n\t"
"L_%=:dec r16" "\n\t" //1
"tst r16" "\n\t" //1
"brne L_%=" "\n\t" //2
:::"r16");
}
}




int init_ausgang(void)
{

/*outp(0xFF, DDRC); // Alle Ports von C als Output setzen
outp(0xFF, PORTC); // Alle LEDs aus
*/

DDRC=(1<<DDC0);
PORTC=(1<<DDC0);
}

int ausgabe_on(void)
{

PORTC=(0<<DDC0);

}


int ausgabe_off(void)
{

PORTC=(1<<DDC0);

}

int init_eingang(void)
{

DDRA = 0x00;

}



int main(void) {
unsigned int keys;
unsigned char i;
unsigned int x;
unsigned char ledout[10];



init_ausgang();
init_eingang();
init_usart();
i=0;
x=0;


//itoa(x, ledout, 10);


//uart_puts("Ist doch ein stück weiter\n");



for (;;) {
keys = PINA;

if ( !(PINA & (1<<0)) & i==0 ) {
ausgabe_on();
i=1;
wait(500*ms);
x++;
usartprintnl();
usartprintcr();
uart_puts(itoa(x, ledout, 10));
}

if ( !(PINA & (1<<0)) & i==1 ) {
ausgabe_off();
i=0;
wait(500*ms);
x++;
usartprintnl();
usartprintcr();
uart_puts(itoa(x, ledout, 10));
}






}


return 0;
}

( Codetag eingefügt, Kjion )