PIC programmering i C

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
ZigBee
Inlägg: 161
Blev medlem: 2 augusti 2006, 04:48:42
Ort: Jönköping

Inlägg av ZigBee »

Tack för svaret.

Det har du rätt i. Men det är ju ganska bra o ha det samlat också.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Men det är ju ganska bra o ha det samlat också.

För vem ? Eller är *du* viktigare än de andra flera tusen användarna ??
Naturligtsvis inte...
ZigBee
Inlägg: 161
Blev medlem: 2 augusti 2006, 04:48:42
Ort: Jönköping

Inlägg av ZigBee »

Detta projekt blev färdigt för några månader sedan. Jag har bytt jobb och jobbar inte kvar på det företaget längre men enheten används för utvärdering av reed sensorer och designtest fortfarande, främst i ett nuvarande projekt där det är problem med brytpunkter med en reed sensor som leder till allvarliga konsekvenser. Reed sensorn sitter i en automatväxelspak till en bil och problemet leder till att man inte får ut nyckeln.

Struktur:

Fixtur:
Som synes på bild bestående av 2 stegmotorer och en optisk sensor för avkänning av läget på en av stegmotorerna vid kalibrering.

Reedsensor som monteras dit för utvärdering.

Kontrollbox:
Här sitter all styrelektronik bestående av en Microchip MCU16F690 och en MAX232 krets för seriell kommunikation till datorn. Stegmotorerna styrs i oilka sekvenser härifrån och information om brylägena i reedsensorn tas emot här och skicat till datorn.

Dator/RS232
I ett användarvänligt LabView program kan man logga mätningar och spara dessa till en exelfil. Det finns en mall som gör att man får ut en 2D graf över brytpunkterna för reedsensor med hysteren som uppstår också.

Det blir väldigt mycket info och data som man behöver för utvärderingen.

Det kluriga i detta projekt var att få mjukvaran att fungera, vilket inte alltid var helt trivialt fasttän det låter lätt. Att jag hade rosta c kunskaper och programmeringskunskaper allmänt gjorde nog sitt.

Här är lite bilder.




http://picasaweb.google.com/lh/photo/Q9 ... directlink

http://picasaweb.google.com/lh/photo/RN ... directlink

http://picasaweb.google.com/lh/photo/Il ... directlink




*Edit fixade bildlänkarna
Senast redigerad av ZigBee 23 december 2008, 14:29:34, redigerad totalt 3 gånger.
ZigBee
Inlägg: 161
Blev medlem: 2 augusti 2006, 04:48:42
Ort: Jönköping

Inlägg av ZigBee »

//---------------------------------------------------------------------
//
//
//
//---------------------------------------------------------------------
// Filename: ProgramOne.c
// Date:
// Version: 1.00
//
// Written By:
// Company:
//---------------------------------------------------------------------
//
// Architecture: Baseline PIC
// Processor: 16F690
// Compiler: HiTech PICC-Lite
//
//
// The following files should be included in the MPLAB project:
//
// Delay.h
// delayone.h
// Serial.h
//---------------------------------------------------------------------
//
//Description:
//
//Software is in while loop at first and LED is blinking. When start buton is pressed a measurement is performed.
//Then LEDs are blinking. When start button is pressed a new measurement can be started and so on
//
//
//LED1=Start of program
//LED2=Button Pressed
//LED3=Calibration finished, measurement started
//LED4=Activation of Reed sensor, On = Reed sensor activated, OFF= Reed sensor deactivated
//
//All LEDs blinking=READY Waiting mode for pressing button, for calibration and measurement
//LED 1 blinking, Loosing steps when counting steps for step motors.
//
//
//
//
//---------------------------------------------------------------------
//Pin Assignments:
//
//RA0=ICSP
//RA1=ICSP
//RA2=Reed sensor, Interrupt activated, hw pulldown, debounce
//RA3=Button
//RA4=Interface
//RA5=Start button, debounce
//RB4=Opto1 Green cable (White to ground)
//RB5=
//RB6=Opto2 Green cable (White to ground)
//RB7=
//RC0=LED1
//RC1=LED2
//RC2=LED3
//RC3=LED4
//RC4=SM1Step+ Blue
//RC5=SM1Dir+ Red
//RC6=SM2Step+ Blue
//RC7=SM2Dir+ Red
//
//Enable+ connections have black cable
//---------------------------------------------------------------------
//
//Communication frame
// // Byte 1 // Byte 2 // Byte 3-4 // Byte 5-6 // Byte 7 //
// //Start byte//Data byte//Step Motor 1 counter byte(2X)//Step Motor 2 counter byte(2X)//End byte//
//HSB-LSB
//
//
//---------------------------------------------------------------------
//Constant Definitions
//
//SMOneStepCount Counting steps performed by Step Motor 1
//
//
//
//SMTwoStepCount Counting steps performed by Step Motor 2
//
//
//
//Data -Use a char for additional info
//Bit7=Reed status 1 = Activated, 0=Inactivated
//Bit6=DirSMOne
//Bit5=DirSMTwo
//Bit4=Free
//Bit3= Number of bytes in data
//Bit2= Number of bytes in data
//Bit1= Number of bytes in data
//Bit0= Number of bytes in data
//----------------------------------------------------------------------



#include <htc.h> //Shall be included regarding to PICC manual
#include <pic.h> //Should be included for TRIS regarding to PICC manual
//#include <16F690.h>

#define XTAL_FREQ 4MHZ
#include "delay.h" //Defines DelayMs()//ändrade till citattecken 2008-09-11
#include "Serial.h"
#include "delayone.h"








// Configurate hardware: ext reset, no code protect, no watchdog, 4 MHz int clock, internal oscillator
#define _16F690_ //Defines functionalities and registers and variables for 16F690
__CONFIG(FCMDIS & IESODIS & BORDIS & UNPROTECT & MCLRDIS & PWRTEN & WDTDIS & INTIO);






//---------------------------------------------------------------------
// Pin Definitions

FOSC2=1; //I/O function on RA4 and RA5, Setting in CONFIG register
FOSC1=0; //I/O function on RA4 and RA5, Setting in CONFIG register
FOSC0=0; //I/O function on RA4 and RA5, Setting in CONFIG register
INTOSCIO=1; //Use internal oscillator

//---------------------------------------------------------------------
// Define

#define bit_set(var,bitno) ((var) |= 1 << (bitno)) //Set a bit in a variable
#define bit_clr(var,bitno) ((var) &= ~(1<< (bitno)) //Clear a bit in a variable

//---------------------------------------------------------------------
//Global variables

volatile unsigned int SMOneStepCount; // Since it is referenced both in main and in isr
volatile unsigned int SMTwoStepCount; //Eventually maked signed due to calibration
volatile unsigned char Data; //See description in header

//---------------------------------------------------------------------


unsigned char GetLowChar(unsigned int x)
{
unsigned char z;
return z=(unsigned char)(x&0xFF); //Type cast x to char, and "bit and" to selects its lower byte into z
}


unsigned char GetHighChar(unsigned int x)
{
unsigned char z;
return z=(unsigned char)(x>>8); //Type cast x to char, and shift the second byte in x to z
}

unsigned char GetLowCharTest(unsigned int x)
{
unsigned char z;
return z=(unsigned char)(x&0xFF); //Type cast x to char, and "bit and" to selects its lower byte into z
}


unsigned char GetHighCharTest(unsigned int x)
{
unsigned char z;
return z=(unsigned char)(x>>8); //Type cast x to char, and shift the second byte in x to z
}


void initserial(void); //Initiera Seriell kommunikation
bit putchar(char); //Initiera Seriell kommunikation



InitPorts()
{
//Initiate PORTs
TRISC = 0x11111000; //0b11111000?
TRISA = 0xFF;
TRISB4 =0b1; //Input
TRISB6 =0b1; //Input

WPUB = 0x00;
WPUA = 0x00;
ANSEL = 0x00;
ANSELH = 0x00;

RABPU=1; //RABPU: PORTA/PORTB Pull-up Enable bit 1=Disabled

//Pin RA5 I/O
//TMR1LPEN=0; //
TMR1CS=0; //Internal clock do not use pin RA5/T1clk1
TMR1ON=0; //Stop timer1


// Init RB4
ADCON0=0b11110100;

//CHS=0b1101;
//ADON=0b0; Disable ADON


SSPEN=0; //Disables serial port and uses pins as I/O
}








InitInterrupt()
{
//Initialize interrupt INTCON

INTCON=0b10010000;

//Description of bits in INTCON, Interrupt Control register
//GIE=1; //Enable global interrupt bit 7
//PEIE=0; //Disable peripheral interrupt bit 6
//T0IE=0; // Timer0 overflow intereupt enable bit bit 5
//INTE=0; //Enable RA2/INT Interrupt bit 4
//RABIE=1; //Enable PortA and PortB interrupt bit3
//T0IF=0; //Timer0 overflow bit 2
//INTF=0; //Clear to enable bit 1
//RABIF=0; //Clear to enable bit 0


INTEDG=0; //Rising edge triggered RA2/INT


IOCA=0b00100100;
IOCB=0x00;

//Description of bits in IOCA Register
//Enable/Disable individual ports
//IOCA0=0; //Disable individual interrupt port RA0
//IOCA1=0; //Disable individual interrupt port RA1
//IOCA2=1; //Enable individual interrupt port RA2
//IOCA3=0; //Disable individual interrupt port RA3
//IOCA4=0; //Disable individual interrupt port RA4
//IOCA5=1; //Enable individual interrupt port RA5


}


SUSMO(unsigned int a) //Step up Step Motor 1
{
unsigned int step;
RC5=0; //Dir SM1 CW 0=Kugghjul CW
bit_clr(Data,6); //Set direction info in variable to send out 0=CW

for(step=0; step<=a; step++)
{

RC4=1;
DelayMs(1);

RC4=0;
DelayMs(1);
SMOneStepCount++;

}
}





SDSMO(unsigned int b)
{
unsigned int step;
RC5=1; //Dir SM1 CW 1=Kugghjul ACW
bit_set(Data,6); //Set direction info in variable to send out 1=ACW

for(step=0; step<=b;step++) //
{


RC4=1;
DelayMs(1);

RC4=0;
DelayMs(1);
//if(SMOneStepCount>0) //Så att värdet inte kan bli 0xFFFF
//{
SMOneStepCount--;
//}

//else
//{
//return;
//}
}
}




SUSMT(unsigned int c)
{
unsigned int step;
RC7=1; //Dir SM2 CW 1=Up
bit_set(Data,5); //Set direction info in variable to send out 1=Up

for(step=1; step<=c;step++)
{


RC6=1;
DelayMs(1);

RC6=0;
DelayMs(1);
SMTwoStepCount++;
}
}



SDSMT(unsigned int d)
{
unsigned int step;
RC7=0; //Dir SM2 CW 0=Down
bit_clr(Data,5); //Set direction info in variable to send out 0=Down

for(step=1; step<=d;step++)
{


RC6=1;
DelayMs(1);

RC6=0;
DelayMs(1);

//if(SMTwoStepCount>0) //Så att värdet inte kan bli 0xFFFF
//{
SMTwoStepCount--;
//}

}
}








InitSMOne() //Max Step is 400
{

SUSMO(100); //Max Step is 400 in 12 steps

DelayMs(100);

while(RB4==0)
{
SDSMO(1);
}

DelayMs(100);

while(RB4==1) //So that the sensor is desactivated again.
{
SUSMO(1);
}

}


InitSMTwo()
{


SUSMT(20); //Max step is 340 steps in 12 steps (50 original value), end value is 320 during measurement.

DelayMs(100);

while(RB6==0)
{
SDSMT(1);
}

DelayMs(100);

while(RB6==1) //So that the sensor is desactivated again.
{
SUSMT(1);
}

}









InitStepMotors()
{

InitSMOne();
InitSMTwo();

}







bit putcharTest( unsigned char d_out ) // sends one char for calibration due to original function is non reentrant
{

while (!TXIF) ; // wait until previus character transmitted
TXREG = d_out; //Send
return 1; // done

}







SendOutSerialTest() //To control the calibration data, send out an empty Internal Data to recognize the word
{


unsigned char Lowa = (GetLowCharTest(SMOneStepCount)); //Get 0x34 av talet 0x1234
unsigned char Higha = (GetHighCharTest(SMOneStepCount)); //Get 0x12 av talet 0x1234

unsigned char Lowb = (GetLowCharTest(SMTwoStepCount)); //Get 0x34 av talet 0x1234
unsigned char Highb = (GetHighCharTest(SMTwoStepCount)); //Get 0x12 av talet 0x1234



initserial(); //Init USART


bit_clr(Data,7); //Send =0
bit_clr(Data,6);
bit_clr(Data,5);
bit_clr(Data,4);
bit_clr(Data,3);
bit_clr(Data,2);
bit_clr(Data,1);
bit_clr(Data,0);

putcharTest(0xFF); //STX Start of transmission
putcharTest(Data); //Sensor status, direction status of SM´s and Control bit
putcharTest(Lowa); //Skicka 0x34 av talet 0x1234 Send info for stepmotor 1 (a)
putcharTest(Higha); //Skicka 0x12 av talet 0x1234 Send info for stepmotor 1 (a)
putcharTest(Lowb); //Skicka 0x34 av talet 0x1234 Send info for stepmotor 2 (b)
putcharTest(Highb); //Skicka 0x12 av talet 0x1234 Send info for stepmotor 2 (b)
putcharTest(0xFE); //ETX End of transmission

//Use DelayMsInt inside this function


}



StepUpSMOne() //Step up SMOne Max steps
{
int SMOneMaxStep=440;
SMOneStepCount=0; //Clear from here because each time this function is called it is a new loop
SUSMO(SMOneMaxStep); // Max Step is 440 in 1/2 steps


DelayMs(10); //Delay before changing direction, even if it is not needed here due to SMTwo stepping



//End of StepUpSMOne


}







StepDownSMOne()
{

//Assume that MaxStepSMOne is 440

while(RB4==0)
{
SDSMO(1);
}

DelayMs(100);

while(RB4==1) //So that the sensor is desactivated again.
{
SUSMO(1);
}

/* Do not send out calibration data

//Send out empty protocol = last test step was sucessful without loosing step counting
putcharTest(0xFF);
putcharTest(0x00);
putcharTest(0x00);
putcharTest(0x00);
putcharTest(0x00);
putcharTest(0x00);
putcharTest(0xFE);


DelayMs(1000); //Delay before changing direction


if(SMOneStepCount!=10)
{


RC0=1;
DelayMs(1000);
RC0=0;
DelayMs(1000);
RC0=1;
DelayMs(1000);
RC0=0;
DelayMs(1000);
RC0=1;
DelayMs(1000);
RC0=0;
DelayMs(1000);
RC0=1;
DelayMs(1000);
RC0=0;
DelayMs(1000);

//This protocoll is sent before the sending out of the actual counting, if(SMOneStepCount!=0) after last test step
putcharTest(0xFF);
putcharTest(0xFD);
putcharTest(0x00);
putcharTest(0x00);
putcharTest(0x00);
putcharTest(0x00);
putcharTest(0xFE);



SendOutSerialTest();


}
*/ //End of do not send out calibration data


}









/*
Old without calibration

StepDownSMOne()
{

//Assume that MaxStepSMOne is 440

SDSMO(440); // Max Step is 440 in 1/2 steps

//Send out empty protocol = last test step was sucessful without loosing step counting
putcharTest(0xFF);
putcharTest(0x00);
putcharTest(0x00);
putcharTest(0x00);
putcharTest(0x00);
putcharTest(0x00);
putcharTest(0xFE);


DelayMs(1000); //Delay before changing direction


if(SMOneStepCount!=0)
{


RC0=1;
DelayMs(1000);
RC0=0;
DelayMs(1000);
RC0=1;
DelayMs(1000);
RC0=0;
DelayMs(1000);
RC0=1;
DelayMs(1000);
RC0=0;
DelayMs(1000);
RC0=1;
DelayMs(1000);
RC0=0;
DelayMs(1000);

//This protocoll is sent before the sending out of the actual counting, if(SMOneStepCount!=0) after last test step
putcharTest(0xFF);
putcharTest(0xFD);
putcharTest(0x00);
putcharTest(0x00);
putcharTest(0x00);
putcharTest(0x00);
putcharTest(0xFE);



SendOutSerialTest();


}
}

*/






StartMeasurement()
{
unsigned int step;
unsigned int SMTwoMaxStep=320;
SMTwoStepCount=1; //Clear here because the counter will never be reset, it will be reset during startup of new meas
for(step=1;step<=SMTwoMaxStep;step++)
{
StepUpSMOne();
StepDownSMOne();
SUSMT(1);

}
}























main()
{
RC0=1; //indicate Start main
InitPorts();

SPEN = 0; //Disable serial communication
GIE=0; //Disable intterupt so that no messages are sent during initialization


while(1) //Loop forever and stay here
{
if(RA5==0)
{
RC0=1;
RC1=1; //Indicates Button pressed
InitStepMotors();
RC2=1;
DelayMs(1000);
RC2=0;
DelayMs(1000);
RC2=1; //Indicate SMs initialized
DelayMs(1000);
InitInterrupt(); //Init Interrutp and enable interrupt




StartMeasurement();
RC0=1; //Start
RC1=1; //Button pressed
RC2=1; //Measurement finished

}
RC0=1; //Blink LEDs Idle status
RC1=1;
RC2=1;
RC3=1;
DelayMs(1000);
RC0=0;
RC1=0;
RC2=0;
RC3=0;
DelayMs(1000);
}


}



SendOutSerial()
{

//Because DelayMs is nonreentrant use DelayMsInt


unsigned char Lowa = (GetLowChar(SMOneStepCount)); //Get 0x34 av talet 0x1234
unsigned char Higha = (GetHighChar(SMOneStepCount)); //Get 0x12 av talet 0x1234



unsigned char Lowb = (GetLowChar(SMTwoStepCount)); //Get 0x34 av talet 0x1234
unsigned char Highb = (GetHighChar(SMTwoStepCount)); //Get 0x12 av talet 0x1234


initserial(); //Init USART

DelayMsInt(5); //Reed sensor debounce

if(RA2==1) //Fill "Data" Evalute status of reed sensor
{
bit_set(Data,7); //Indicates ReedSensor is activated
RC3=1; //Indicate status of Reed with LED
}

if(RA2==0) //Evalute status of reed sensor
{
bit_clr(Data,7); //Indicates ReedSensor is deactivated
RC3=0; //Indicate status of Reed with LED
}



//Available bits for additional data, now data length
bit_clr(Data,3); //Size of data sent 7 Bytes 0bxx000111
bit_set(Data,2); //Size of data sent
bit_set(Data,1); //Size of data sent
bit_set(Data,0); //Size of data sent

//Communication protocol
putchar(0xFF); //STX Start of transmission
putchar(Data); //Sensor status, direction status of SM´s and Control bit
putchar(Lowa); //Skicka 0x34 av talet 0x1234 Send info for stepmotor 1 (a)
putchar(Higha); //Skicka 0x12 av talet 0x1234 Send info for stepmotor 1 (a)
putchar(Lowb); //Skicka 0x34 av talet 0x1234 Send info for stepmotor 2 (b)
putchar(Highb); //Skicka 0x12 av talet 0x1234 Send info for stepmotor 2 (b)
putchar(0xFE); //ETX End of transmission


//All data överföring fungerar
//Att ogiltig data skickades ut första varvet berodde på att en variabel var =0 första varvet. Alla variabler är satta nu till att vara minst ett. INklusive data.
//Reed debouncing implemented


}





unsigned char prev_porta=0; // Find out which pin on PortA caused interrupt
unsigned char prev_portb=0; // Find out which pin on PortB caused interrupt

interrupt isr() //Outside Main, interrupt service routin, deklarere interrupt in this routince for different cases
{


if(INTF=1) // On (rising) edge of RA2 ReedSensor
{

SendOutSerial();

INTF=0; //Clear to enable
}


prev_porta=PORTA; //Update status of Port A
prev_portb=PORTB; //Update status of Port A
RABIF=0; //Clear to enable
//INTF=0; //Clear to enable


//End interrupt

return;
}
ZigBee
Inlägg: 161
Blev medlem: 2 augusti 2006, 04:48:42
Ort: Jönköping

Inlägg av ZigBee »

Programmet ovan använder några subrutiner också; Finns det några fel i programmet kan de bero på att det inte är sista versionen av programone.c men det ska vara någon liten detalj som kan vara bortkommenterad i så fall bara.


***************Serial.c**************************************

#include "Serial.h"



void initserial( void ) // Initialize serialcom port
{
SPEN = 1; //Serial Port enable
BRGH = 1; // Async high speed
TXEN = 1; // transmit enable
SPBRG = 26-1; // 9600 Baud @ 4 MHz-clockfrequency
CREN = 1; // Continuous receive
RX9 = 0; // 8 bit reception
TRISB7 = 0; // serial_out is output
TRISB5 = 1; // serial_in is input
}


bit putchar( unsigned char d_out ) // sends one char
{


while (!TXIF) ; // wait until previus character transmitted
TXREG = d_out; //Send
return 1; // done

}






// If two (or more) char's are recieved, but not read, the reciever will be locked!
// To unlock the reciever, run function OverrunRecover()

void OverrunRecover(void)
{
char trash;
trash = RCREG; // the two char's that locked the reciever
trash = RCREG; // are read and ignored
CREN = 0; // the unlock procedure ...
CREN = 1;
}


char getchar( void ) // recieves one char
{
// One start bit, one stop bit, 8 data bit, no parity. 9600 Baud.
char d_in;
while ( RCIF == 0 ); // wait for char
d_in = RCREG;
return d_in;
}


*************** END Serial.c***********************************



***************Delay.c***************************************

#include "delay.h"
void
DelayMs(unsigned char cnt)
{
#if XTAL_FREQ <= 2MHZ
do {
DelayUs(996);
} while(--cnt);
#endif

#if XTAL_FREQ > 2MHZ
unsigned char i;
do {
i = 4;
do {
DelayUs(250);
} while(--i);
} while(--cnt);
#endif
}
******************** END Delay.C************************
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Jag har bytt jobb och jobbar inte kvar på det företaget längre

Vem äger koden som du har postat här ?
Och varför är den postad här ?

Att koden är postad utan code-taggar gör det bara oläsligt,
men det gör sannolikt mindre skada...
ZigBee
Inlägg: 161
Blev medlem: 2 augusti 2006, 04:48:42
Ort: Jönköping

Inlägg av ZigBee »

sodjan,

Din inställning igenom hela tråden är ju ganska uppenbar.

Så vad är ditt problem om man får fråga?
dangraf
Inlägg: 530
Blev medlem: 9 juni 2003, 15:30:56
Ort: göteborg

Inlägg av dangraf »

Jag har nog tappat den röda tråden i denna tråd.
Från början verkade det hela handla om hjälp med C-programmering till PIC men nu känns det lite oklart. Är det något problem med koden som postats? Eller är det bara en pressentation av resultatet av ett projekt? eller diskuteras något helt annat?
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Så vad är ditt problem om man får fråga?

Jag har inget problem.

Ditt problem kan vara att du har publikt postat
kod som tillhör någon annan. Ville bara att du
är medveten om det (om det är så). Det verkade/lät
som om det var utvecklat inom ett företag åt ett företag
och då tillhör resultatet samma företag (där du tydligen
inte finns kvar längre)...

Sen är det ett generellt problem att den är svår att
läsa utan code-taggar, men det är ju inte något
unikt problem för mig... :-)

Slutligen är det ett mysterium varför koden finns här alls,
men det kanske bara är något jag har missat i hastigheten.
Fanns det någon fråga kring koden ?
ZigBee
Inlägg: 161
Blev medlem: 2 augusti 2006, 04:48:42
Ort: Jönköping

Inlägg av ZigBee »

Projektet är nu slutfört och jag har presenterat resultet ovan.

Ämnet började med att behövde hjälp med att programmera i C. Jag skulle påbörja ett projekt med att driva en testfixtur. Jag bestämde mig för att göra det med microchip MCU och programmera i C.

Jag fick hjälp på vägen här.

Så jag vill visa att det har resulterat i något praktiskt som används. Nu har jag presenterat resultatet, vilken är den slutliga koden här ovan.

Koden sitter i en box som driver en testfixtor med 2 stegmotorer och 2 sensorer och skickar resultatet till ett labview program på en dator.

Det fanns många saker jag frågade om, fick hjälp med och som vi diskuterade. I koden kan man se vilka metoder som implementerades till slut.

Finns det någon fråga på koden eller något annat så förklarar jag gärna.

Tack för all hjälp.
Skriv svar