Håll i er, nu kommer koden här.. kanske är en bra ide att ta in den i Programmers notepad eller liknande, har kommenterat bort lite saker..
Följande fel finns.
Koden fungerar i nedanstående skick så länge jag inte deklarerar
det som är markerat med *?*?*?*?
Då verkar den inte starta Tasken..
Använder ett 16 Tangenters tgb.
Kod: Markera allt
/*
KOPPLA IN SÅHÄR:
PORTA->NR2
PORTB->NR5
PORTC->NR1
PORTD->NR3
*/
#include <c:/avrx/avrx/avrx-io.h>
#include <c:/avrx/avrx/avrx-signal.h>
#include "c:/avrx/avrx/Avrx.h"
#include "hardware.h"
#include <string.h>
#define timerdelay 70000
#define timerdelay1 550
char *nb1="Last: 1";
char *nb2="Last: 2"; //*?*?*?*?*?*?*?*?*?
void set_rs(void);
void write_dd_ram(void);
void e_rsclock(void);
void eclock(void);
void delay(void);
void cleardisplay(void);
void disp(char*, int);
TimerControlBlock Timer1,Timer2,Timer3; // Create a control blocks for a timer
MessageControlBlock no1,no2,no3,no4,no5,no6,no7,no8,no9,no0,noA,noB,noC,noD,noStar,noBrackets; // Create simple messages (no internal data)
MessageQueue Queue1; // Create a message queue
/*
Timer 0 Overflow Interrupt Handler
Prototypical Interrupt handler:
. Switch to kernel context
. handle interrupt
. switch back to interrupted context.
*/
AVRX_SIGINT(SIG_OVERFLOW0)
{
IntProlog(); // Switch to kernel stack/context
outp(TCNT0_INIT, TCNT0); // Reset timer overflow count
AvrXTimerHandler(); // Call Time queue manager
Epilog(); // Return to tasks
}
//Skapa 3 task. Rinnande ljus, rinnande ljus, och 1 till.
AVRX_GCC_TASK(task1, 70, 3); // Create three tasks with 70 bytes stacksize and priority 3
AVRX_GCC_TASK(task2, 110, 3);
AVRX_GCC_TASK(task3, 30, 3);
//*****TASK1*****
NAKEDFUNC(task1) // Task 1
{
for(;;)
{
int temp=0,temp1=0;
temp=inp(PINC);
temp1=temp&16;
if(temp1==16)
{
PORTC=PORTC&223; //Output enable går LÅG.
//outp(0x00, PORTA);
AvrXDelay(&Timer1,1); //Vänta 1ms.
temp=inp(PINC); //Lägg PINC till temp, dvs tangenpositionen i temp.
PORTC=PORTC|32; //Output enable går HÖG.
switch(temp){
case 3 : AvrXSendMessage(&Queue1, &no1); // Skicka Meddelande till kö1
AvrXWaitMessageAck(&no1); //Vänta på kvitto
case 2 : AvrXSendMessage(&Queue1, &no2); // Skicka Meddelande till kö1
AvrXWaitMessageAck(&no2); //Vänta på kvitto
case 1 : AvrXSendMessage(&Queue1, &no3); // Skicka Meddelande till kö1
AvrXWaitMessageAck(&no3); //Vänta på kvitto
case 0 : AvrXSendMessage(&Queue1, &noA); // Skicka Meddelande till kö1
AvrXWaitMessageAck(&noA); //Vänta på kvitto
case 7 : AvrXSendMessage(&Queue1, &no4); // Skicka Meddelande till kö1
AvrXWaitMessageAck(&no4); //Vänta på kvitto
case 6 : AvrXSendMessage(&Queue1, &no5); // Skicka Meddelande till kö1
AvrXWaitMessageAck(&no5); //Vänta på kvitto
case 5 : AvrXSendMessage(&Queue1, &no6); // Skicka Meddelande till kö1
AvrXWaitMessageAck(&no6); //Vänta på kvitto
case 4 : AvrXSendMessage(&Queue1, &noB); // Skicka Meddelande till kö1
AvrXWaitMessageAck(&noB); //Vänta på kvitto
case 11: AvrXSendMessage(&Queue1, &no7); // Skicka Meddelande till kö1
AvrXWaitMessageAck(&no7); //Vänta på kvitto
case 10: AvrXSendMessage(&Queue1, &no8); // Skicka Meddelande till kö1
AvrXWaitMessageAck(&no8); //Vänta på kvitto
case 9 : AvrXSendMessage(&Queue1, &no9); // Skicka Meddelande till kö1
AvrXWaitMessageAck(&no9); //Vänta på kvitto
case 8 : AvrXSendMessage(&Queue1, &noC); // Skicka Meddelande till kö1
AvrXWaitMessageAck(&noC); //Vänta på kvitto
case 15: AvrXSendMessage(&Queue1, &noStar); // Skicka Meddelande till kö1
AvrXWaitMessageAck(&noStar); //Vänta på kvitto
case 14: AvrXSendMessage(&Queue1, &no0); // Skicka Meddelande till kö1
AvrXWaitMessageAck(&no0); //Vänta på kvitto
case 13: AvrXSendMessage(&Queue1, &noBrackets); // Skicka Meddelande till kö1
AvrXWaitMessageAck(&noBrackets); //Vänta på kvitto
case 12: AvrXSendMessage(&Queue1, &noD); // Skicka Meddelande till kö1
AvrXWaitMessageAck(&noD); //Vänta på kvitto
}
}
else{
PORTB=0;
}
}
}
//Task2, kollar efter och fixar med meddelanden.
NAKEDFUNC(task2)
{
MessageControlBlock *p; // Create a pointer to a MessageControlBlock
while (1)
{
p=AvrXWaitMessage(&Queue1); // Wait for new message @ Queue1
if(p==&no1)
{
disp(nb1, 7);
AvrXAckMessage(p);
}
else
if (p==&no2)
{
disp(nb2, 7);
AvrXAckMessage(p);
}
/*
else
if (p==&no3)
{
disp(nb3, 7);
AvrXAckMessage(p);
}
else
if (p==&no4)
{
disp(nb4, 7);
AvrXAckMessage(p);
}
else
if (p==&no5)
{
disp(nb5, 7);
AvrXAckMessage(p);
}
else
if (p==&no6)
{
disp(nb6, 7);
AvrXAckMessage(p);
}
else
if (p==&no7)
{
disp(nb7, 7);
AvrXAckMessage(p);
}
else
if (p==&no8)
{
disp(nb8, 7);
AvrXAckMessage(p);
}
else
if (p==&no9)
{
disp(nb9, 7);
AvrXAckMessage(p);
}
else
if (p==&no0)
{
disp(nb0, 7);
AvrXAckMessage(p);
}
else
if (p==&noStar)
{
disp(nbStar, 7);
AvrXAckMessage(p);
}
else
if (p==&noBrackets)
{
disp(nbBrackets, 7);
AvrXAckMessage(p);
}
else
if (p==&noA)
{
disp(nbA, 7);
AvrXAckMessage(p);
}
else
if (p==&noB)
{
disp(nbB, 7);
AvrXAckMessage(p);
}
else
if (p==&noC)
{
disp(nbC, 7);
AvrXAckMessage(p);
}
else
if (p==&noD)
{
disp(nbD, 7);
AvrXAckMessage(p);
}
*/
AvrXHalt();
}
}
//******TASK3******
NAKEDFUNC(task3)
{
}
void main(void) // Main runs under the AvrX Stack
{
AvrXSetKernelStack(0); // Set kernel stack to current SPL/SPH
//outp((1<<SE), MCUCR); // Enable "Sleep" instruction
outp(TCNT0_INIT, TCNT0);
outp(TMC8_CK256, TCCR0); // Set up Timer0 for CLK/256 rate
outp((1<<TOIE0), TIMSK); // Enable Timer0 overflow interrupt
DDRC=0x20;
PORTC=PORTC|20;
DDRA=255;
DDRD=255;
outp(0xFF, DDRB); // Make PORT B output and...
outp(0xFF, PORTB); // LEDs on
PORTA=56;
eclock();
PORTA=15;
eclock();
PORTA=6;
eclock();
cleardisplay();
AvrXRunTask(TCB(task1)); // Start task1
AvrXRunTask(TCB(task2)); // Start task2
//AvrXRunTask(TCB(task3));
Epilog(); // Switch from AvrX Stack to first task
return(0);
}
//*****Delay*****
void delay()
{
long i; // Declare a variable
for(i=0;i<=timerdelay;i=i+1) // Do nothing for "timerdelay" times
{}
}
//***************
//*****E_Clock*****
//Klockar ut Instruktioner
void eclock()
{
PORTD=4;
delay();
PORTD=0;
}
//***************
//*****RS_Clock*****
//Klockar ut tecken
void e_rsclock()
{
PORTD=5;
delay();
PORTD=0;
}
//******************
//*****Write_dd_ram*****
//Stoppar efter 8 tecken
void write_dd_ram()
{
PORTA=192;
eclock();
}
//**********************
//*****write RS R/W och E*****
void set_rs()
{
delay();
PORTD=4;
delay();
PORTD=0;
delay();
}
//****************************
//*****Rensa Displayen*****
void cleardisplay()
{
PORTA=1;
eclock();
delay();
}
//*************************
//**********Display funktion******
void disp(char *string, int x)
{
int c;
int i;
c=0;
x=x-1;
do {
PORTA=string[c];
e_rsclock();
if (c==7) //Byter "rad" på displayen om det behövs.
{
write_dd_ram();
PORTA=string[c];
}
c=c+1;
}
while(c<=x);
}