Microcontroller Systems ELET 3232 Topic 8: Slot Machine Example 1
Agenda We will work through a complete example Use CodeVision and AVR Studio Discuss a few creative instructions Discuss #define and #include Read and write from/to ports Use some of the control statements learned in the last topic 2
Slot Machine // // "Slot Machine" -- The Mini-Exercise // // Phase 1.. #include <Mega8515.h> /* processor specific information */ #define xtal 4000000L /* quartz crystal frequency [Hz] */ #define baud 9600 /* Baud rate */ #include <stdio.h> /* this gets the printf() definition */ // Global Variable Declarations.. char first,second,third; // Columns in the slot machine. char seed; // Number to form a seed for random #s. char count; // General purpose counter. int delay; // A variable for delay time. void main(void) { PORTA = 0xFF; DDRA = 0x00; DDRB = 0x02; // Initialize the I/O ports // port A all inputs // port B.1 is an output (light) //Initialize the UART control register //RX & TX enabled, 8 data bits UCSRB=0x18; // initialize the UART's baud rate UBRRL=xtal/16/baud-1; while(1) { // do forever.. while(pina.0) // Wait for a button and seed++; // let the counter roll over and // over to form a seed. first = second = third = seed; // preload the columns do { // mix up the numbers // while waiting for button release. first ^= seed>>1; // Exclusive ORing in the moving seed second^= seed>>2; // can really stir up the numbers. third ^= seed>>3; seed++; // keep rolling over the seed pattern } while(pina.0 == 0); // while the button is pressed for(count = 0; count < 5; count++) { // flash light when done.. for(delay = 0; delay < 10000; delay++) ; // just count up and wait PORTB.1 = 0; // turn the LED on.. for(delay = 0; delay < 10000; delay++) ; PORTB.1 = 1; // turn the LED off.. } first &= 3; // limit number to values from 0 to 3 second &= 3; third &= 3; printf("--> %d, %d,%d <--\n",first, second, third); // show the values.. // determine a payout.. if((first == 3) && (second == 3) && (third == 3)) printf("paid out: JACKPOT!!\n"); // all "cherries" else if((first == 3) (second == 3) (third == 3)) printf("paid out: One Dime\n"); // if any are "cherries".. else if((first == second) && (second == third)) printf("paid out: One Nickle\n"); // if three are alike, of any kind.. else printf("paid out: ZERO\n"); // otherwise -- you lose.. } } 3
Initialization The #include commands instruct the compiler to include these files as part of the overall program when compiling The Mega8515.h file includes all of the definitions for labels as well as port addresses. The stdio.h file includes functions such as printf and scanf // // "Slot Machine" -- The Mini-Exercise // // Phase 1.. #include <Mega8515.h> /* processor specific information */ #define xtal 4000000L /* quartz crystal frequency [Hz] */ #define baud 9600 /* Baud rate */ #include <stdio.h> /* this gets the printf() definition */ // Global Variable Declarations.. char first,second,third; // Columns in the slot machine. char seed; // Number to form a seed for random #s. char count; // General purpose counter. int delay; // A variable for delay time. void main(void) { PORTA = 0xFF; DDRA = 0x00; DDRB = 0x02; //Initialize the UART control register //RX & TX enabled, 8 data bits // Initialize the I/O ports // port A all inputs // port B.1 is an output (light) UCSRB=0x18; // initialize the UART's baud rate UBRRL=xtal/16/baud-1; 4
Initialization For the Atmega128, we have to change this to Mega128 but, the Atmega128 does not have the UART initialized below // // "Slot Machine" -- The Mini-Exercise // // Phase 1.. #include <Mega8515.h> /* processor specific information */ #define xtal 4000000L /* quartz crystal frequency [Hz] */ #define baud 9600 /* Baud rate */ #include <stdio.h> /* this gets the printf() definition */ // Global Variable Declarations.. char first,second,third; // Columns in the slot machine. char seed; // Number to form a seed for random #s. char count; // General purpose counter. int delay; // A variable for delay time. void main(void) { PORTA = 0xFF; DDRA = 0x00; DDRB = 0x02; // Initialize the I/O ports // port A all inputs // port B.1 is an output (light) //Initialize the UART control register //RX & TX enabled, 8 data bits UCSRB=0x18; // initialize the UART's baud rate UBRRL=xtal/16/baud-1; 5
Initialization For the Atmega128, we have to change this to Mega128 but, the Atmega128 does not have the UART initialized below They will generate errors for the 128 // // "Slot Machine" -- The Mini-Exercise // // Phase 1.. #include <Mega8515.h> /* processor specific information */ #define xtal 4000000L /* quartz crystal frequency [Hz] */ #define baud 9600 /* Baud rate */ #include <stdio.h> /* this gets the printf() definition */ // Global Variable Declarations.. char first,second,third; // Columns in the slot machine. char seed; // Number to form a seed for random #s. char count; // General purpose counter. int delay; // A variable for delay time. void main(void) { PORTA = 0xFF; DDRA = 0x00; DDRB = 0x02; // Initialize the I/O ports // port A all inputs // port B.1 is an output (light) //Initialize the UART control register //RX & TX enabled, 8 data bits UCSRB=0x18; // initialize the UART's baud rate UBRRL=xtal/16/baud-1; 6
Initialization The #define commands instructs the compiler to equate these values with the labels baud and xtal. They are used in the program // // "Slot Machine" -- The Mini-Exercise // // Phase 1.. #include <Mega8515.h> /* processor specific information */ #define xtal 4000000L /* quartz crystal frequency [Hz] */ #define baud 9600 /* Baud rate */ #include <stdio.h> /* this gets the printf() definition */ // Global Variable Declarations.. char first,second,third; // Columns in the slot machine. char seed; // Number to form a seed for random #s. char count; // General purpose counter. int delay; // A variable for delay time. void main(void) { PORTA = 0xFF; DDRA = 0x00; DDRB = 0x02; // Initialize the I/O ports // port A all inputs // port B.1 is an output (light) //Initialize the UART control register //RX & TX enabled, 8 data bits UCSRB=0x18; // initialize the UART's baud rate UBRRL=xtal/16/baud-1; 7
Initialization These variables are global because they are declared outside the main() function first, second, third, seed, and count are declared as char (8-bit unsigned integers). delay is declared as an int, a 16- bit unsigned integer // // "Slot Machine" -- The Mini-Exercise // // Phase 1.. #include <Mega8515.h> /* processor specific information */ #define xtal 4000000L /* quartz crystal frequency [Hz] */ #define baud 9600 /* Baud rate */ #include <stdio.h> /* this gets the printf() definition */ // Global Variable Declarations.. char first,second,third; // Columns in the slot machine. char seed; // Number to form a seed for random #s. char count; // General purpose counter. int delay; // A variable for delay time. void main(void) { PORTA = 0xFF; DDRA = 0x00; DDRB = 0x02; //Initialize the UART control register //RX & TX enabled, 8 data bits // Initialize the I/O ports // port A all inputs // port B.1 is an output (light) UCSRB=0x18; // initialize the UART's baud rate UBRRL=xtal/16/baud-1; 8
Initialization This program has one function: main(). It: Accepts no inputs and Returns no values // // "Slot Machine" -- The Mini-Exercise // // Phase 1.. #include <Mega8515.h> /* processor specific information */ #define xtal 4000000L /* quartz crystal frequency [Hz] */ #define baud 9600 /* Baud rate */ #include <stdio.h> /* this gets the printf() definition */ // Global Variable Declarations.. char first,second,third; // Columns in the slot machine. char seed; // Number to form a seed for random #s. char count; // General purpose counter. int delay; // A variable for delay time. void main(void) { PORTA = 0xFF; DDRA = 0x00; DDRB = 0x02; // Initialize the I/O ports // port A all inputs // port B.1 is an output (light) //Initialize the UART control register //RX & TX enabled, 8 data bits UCSRB=0x18; // initialize the UART's baud rate UBRRL=xtal/16/baud-1; 9
Initialization It first initializes Port A and Port B // // "Slot Machine" -- The Mini-Exercise // // Phase 1.. #include <Mega8515.h> /* processor specific information */ #define xtal 4000000L /* quartz crystal frequency [Hz] */ #define baud 9600 /* Baud rate */ #include <stdio.h> /* this gets the printf() definition */ // Global Variable Declarations.. char first,second,third; // Columns in the slot machine. char seed; // Number to form a seed for random #s. char count; // General purpose counter. int delay; // A variable for delay time. void main(void) { PORTA = 0xFF; DDRA = 0x00; DDRB = 0x02; // Initialize the I/O ports // port A all inputs // port B.1 is an output (light) //Initialize the UART control register //RX & TX enabled, 8 data bits UCSRB=0x18; // initialize the UART's baud rate UBRRL=xtal/16/baud-1; 10
Initialization It first initializes Port A and Port B and then initializes the UART // // "Slot Machine" -- The Mini-Exercise // // Phase 1.. #include <Mega8515.h> /* processor specific information */ #define xtal 4000000L /* quartz crystal frequency [Hz] */ #define baud 9600 /* Baud rate */ #include <stdio.h> /* this gets the printf() definition */ // Global Variable Declarations.. char first,second,third; // Columns in the slot machine. char seed; // Number to form a seed for random #s. char count; // General purpose counter. int delay; // A variable for delay time. void main(void) { PORTA = 0xFF; DDRA = 0x00; DDRB = 0x02; // Initialize the I/O ports // port A all inputs // port B.1 is an output (light) //Initialize the UART control register //RX & TX enabled, 8 data bits UCSRB=0x18; // initialize the UART's baud rate UBRRL=xtal/16/baud-1; 11
Main Program The main program is contained in the while (1) { } loop structure: it mean run forever while (1) { // do forever.. while (PINA.0) // Wait for a button and seed++; // let the counter roll over and // over to form a seed. first = second = third = seed; // preload the columns do { // mix up the numbers // while waiting for button release. first ^= seed>>1; // Exclusive ORing in the moving seed second^= seed>>2; // can really stir up the numbers. third ^= seed>>3; seed++; // keep rolling over the seed pattern } while (PINA.0 == 0); // while the button is pressed for (count = 0; count < 5; count++) { // flash light when done.. for (delay = 0; delay < 10000; delay++) ; // just count up and wait PORTB.1 = 0; // turn the LED on.. for (delay = 0; delay < 10000; delay++) ; PORTB.1 = 1; // turn the LED off.. } first &= 3; // limit number to values from 0 to 3 second &= 3; third &= 3; printf("--> %d, %d,%d <--\n",first, second, third); // show the values.. // determine a payout.. if((first == 3) && (second == 3) && (third == 3)) printf("paid out: JACKPOT!!\n"); // all "cherries" else if((first == 3) (second == 3) (third == 3)) printf("paid out: One Dime\n"); // if any are "cherries".. else if((first == second) && (second == third)) printf("paid out: One Nickle\n"); // if three are alike, of any kind.. else printf("paid out: ZERO\n"); // otherwise -- you lose.. } } 12
Main Program The main program is contained in the while (1) { } loop structure: it mean run forever while (1) { // do forever.. while (PINA.0) // Wait for a button and seed++; // let the counter roll over and // over to form a seed. first = second = third = seed; // preload the columns do { // mix up the numbers // while waiting for button release. first ^= seed>>1; // Exclusive ORing in the moving seed second^= seed>>2; // can really stir up the numbers. third ^= seed>>3; seed++; // keep rolling over the seed pattern } while (PINA.0 == 0); // while the button is pressed This brace goes with main ( ) for (count = 0; count < 5; count++) { // flash light when done.. for (delay = 0; delay < 10000; delay++) ; // just count up and wait PORTB.1 = 0; // turn the LED on.. for (delay = 0; delay < 10000; delay++) ; PORTB.1 = 1; // turn the LED off.. } first &= 3; // limit number to values from 0 to 3 second &= 3; third &= 3; printf("--> %d, %d,%d <--\n",first, second, third); // show the values.. // determine a payout.. if((first == 3) && (second == 3) && (third == 3)) printf("paid out: JACKPOT!!\n"); // all "cherries" else if((first == 3) (second == 3) (third == 3)) printf("paid out: One Dime\n"); // if any are "cherries".. else if((first == second) && (second == third)) printf("paid out: One Nickle\n"); // if three are alike, of any kind.. else printf("paid out: ZERO\n"); // otherwise -- you lose.. } } 13
Main Program This while loop is made up of these two instructions while (1) { // do forever.. while (PINA.0) // Wait for a button and seed++; // let the counter roll over and // over to form a seed. first = second = third = seed; // preload the columns do { // mix up the numbers // while waiting for button release. first ^= seed>>1; // Exclusive ORing in the moving seed second^= seed>>2; // can really stir up the numbers. third ^= seed>>3; seed++; // keep rolling over the seed pattern } while (PINA.0 == 0); // while the button is pressed for (count = 0; count < 5; count++) { // flash light when done.. for (delay = 0; delay < 10000; delay++) ; // just count up and wait PORTB.1 = 0; // turn the LED on.. for (delay = 0; delay < 10000; delay++) ; PORTB.1 = 1; // turn the LED off.. } first &= 3; // limit number to values from 0 to 3 second &= 3; third &= 3; printf("--> %d, %d,%d <--\n",first, second, third); // show the values.. // determine a payout.. if((first == 3) && (second == 3) && (third == 3)) printf("paid out: JACKPOT!!\n"); // all "cherries" else if((first == 3) (second == 3) (third == 3)) printf("paid out: One Dime\n"); // if any are "cherries".. else if((first == second) && (second == third)) printf("paid out: One Nickle\n"); // if three are alike, of any kind.. else printf("paid out: ZERO\n"); // otherwise -- you lose.. } } 14
Main Program This while loop is made up of these two instructions. As long as the button is not pushed (connected to bit 0 of Port A), PINA.0 will be 1 (or TRUE) and seed will be incremented. while (1) { // do forever.. while (PINA.0) // Wait for a button and seed++; // let the counter roll over and // over to form a seed. first = second = third = seed; // preload the columns do { // mix up the numbers // while waiting for button release. first ^= seed>>1; // Exclusive ORing in the moving seed second^= seed>>2; // can really stir up the numbers. third ^= seed>>3; seed++; // keep rolling over the seed pattern } while (PINA.0 == 0); // while the button is pressed for (count = 0; count < 5; count++) { // flash light when done.. for (delay = 0; delay < 10000; delay++) ; // just count up and wait PORTB.1 = 0; // turn the LED on.. for (delay = 0; delay < 10000; delay++) ; PORTB.1 = 1; // turn the LED off.. } first &= 3; // limit number to values from 0 to 3 second &= 3; third &= 3; printf("--> %d, %d,%d <--\n",first, second, third); // show the values.. // determine a payout.. if((first == 3) && (second == 3) && (third == 3)) printf("paid out: JACKPOT!!\n"); // all "cherries" else if((first == 3) (second == 3) (third == 3)) printf("paid out: One Dime\n"); // if any are "cherries".. else if((first == second) && (second == third)) printf("paid out: One Nickle\n"); // if three are alike, of any kind.. else printf("paid out: ZERO\n"); // otherwise -- you lose.. } } 15
Main Program When the button is pushed, the program will execute this assignment statement. while (1) { // do forever.. while (PINA.0) // Wait for a button and seed++; // let the counter roll over and // over to form a seed. first = second = third = seed; // preload the columns do { // mix up the numbers // while waiting for button release. first ^= seed>>1; // Exclusive ORing in the moving seed second^= seed>>2; // can really stir up the numbers. third ^= seed>>3; seed++; // keep rolling over the seed pattern } while (PINA.0 == 0); // while the button is pressed for (count = 0; count < 5; count++) { // flash light when done.. for (delay = 0; delay < 10000; delay++) ; // just count up and wait PORTB.1 = 0; // turn the LED on.. for (delay = 0; delay < 10000; delay++) ; PORTB.1 = 1; // turn the LED off.. } first &= 3; // limit number to values from 0 to 3 second &= 3; third &= 3; printf("--> %d, %d,%d <--\n",first, second, third); // show the values.. // determine a payout.. if((first == 3) && (second == 3) && (third == 3)) printf("paid out: JACKPOT!!\n"); // all "cherries" else if((first == 3) (second == 3) (third == 3)) printf("paid out: One Dime\n"); // if any are "cherries".. else if((first == second) && (second == third)) printf("paid out: One Nickle\n"); // if three are alike, of any kind.. else printf("paid out: ZERO\n"); // otherwise -- you lose.. } } 16
Main Program Then the for loops are executed to blink the LED. PORTB.1 =0, instructs the program to make pin 1 of PORTB low, turning the LED on. PORTB.1 =1, instructs the program to make pin 1 of PORTB high, turning the LED off. while (1) { // do forever.. while (PINA.0) // Wait for a button and seed++; // let the counter roll over and // over to form a seed. first = second = third = seed; // preload the columns do { // mix up the numbers // while waiting for button release. first ^= seed>>1; // Exclusive ORing in the moving seed second^= seed>>2; // can really stir up the numbers. third ^= seed>>3; seed++; // keep rolling over the seed pattern } while (PINA.0 == 0); // while the button is pressed for (count = 0; count < 5; count++) { // flash light when done.. for (delay = 0; delay < 10000; delay++) ; // just count up and wait PORTB.1 = 0; // turn the LED on.. for (delay = 0; delay < 10000; delay++) ; PORTB.1 = 1; // turn the LED off.. } first &= 3; // limit number to values from 0 to 3 second &= 3; third &= 3; printf("--> %d, %d,%d <--\n",first, second, third); // show the values.. // determine a payout.. if((first == 3) && (second == 3) && (third == 3)) printf("paid out: JACKPOT!!\n"); // all "cherries" else if((first == 3) (second == 3) (third == 3)) printf("paid out: One Dime\n"); // if any are "cherries".. else if((first == second) && (second == third)) printf("paid out: One Nickle\n"); // if three are alike, of any kind.. else printf("paid out: ZERO\n"); // otherwise -- you lose.. } } 17
Main Program The program then ANDS each of the variables with the constant 3. It ensures that the variables have to be between 0 and 3. while (1) { // do forever.. while (PINA.0) // Wait for a button and seed++; // let the counter roll over and // over to form a seed. first = second = third = seed; // preload the columns do { // mix up the numbers // while waiting for button release. first ^= seed>>1; // Exclusive ORing in the moving seed second^= seed>>2; // can really stir up the numbers. third ^= seed>>3; seed++; // keep rolling over the seed pattern } while (PINA.0 == 0); // while the button is pressed for (count = 0; count < 5; count++) { // flash light when done.. for (delay = 0; delay < 10000; delay++) ; // just count up and wait PORTB.1 = 0; // turn the LED on.. for (delay = 0; delay < 10000; delay++) ; PORTB.1 = 1; // turn the LED off.. } first &= 3; // limit number to values from 0 to 3 second &= 3; third &= 3; printf("--> %d, %d,%d <--\n",first, second, third); // show the values.. // determine a payout.. if((first == 3) && (second == 3) && (third == 3)) printf("paid out: JACKPOT!!\n"); // all "cherries" else if((first == 3) (second == 3) (third == 3)) printf("paid out: One Dime\n"); // if any are "cherries".. else if((first == second) && (second == third)) printf("paid out: One Nickle\n"); // if three are alike, of any kind.. else printf("paid out: ZERO\n"); // otherwise -- you lose.. } } 18
Main Program The remainder of this program will have no effect because we don t have any output device connected (or simulated) while (1) { // do forever.. while (PINA.0) // Wait for a button and seed++; // let the counter roll over and // over to form a seed. first = second = third = seed; // preload the columns do { // mix up the numbers // while waiting for button release. first ^= seed>>1; // Exclusive ORing in the moving seed second^= seed>>2; // can really stir up the numbers. third ^= seed>>3; seed++; // keep rolling over the seed pattern } while (PINA.0 == 0); // while the button is pressed for (count = 0; count < 5; count++) { // flash light when done.. for (delay = 0; delay < 10000; delay++) ; // just count up and wait PORTB.1 = 0; // turn the LED on.. for (delay = 0; delay < 10000; delay++) ; PORTB.1 = 1; // turn the LED off.. } first &= 3; // limit number to values from 0 to 3 second &= 3; third &= 3; printf("--> %d, %d,%d <--\n",first, second, third); // show the values.. // determine a payout.. if((first == 3) && (second == 3) && (third == 3)) printf("paid out: JACKPOT!!\n"); // all "cherries" else if((first == 3) (second == 3) (third == 3)) printf("paid out: One Dime\n"); // if any are "cherries".. else if((first == second) && (second == third)) printf("paid out: One Nickle\n"); // if three are alike, of any kind.. else printf("paid out: ZERO\n"); // otherwise -- you lose.. } } 19
The program (Slot.c) was copied from the book It can be compiled by CodeVision and simulated with AVR Studio It was typed in using WordPad So, it must be loaded into a CodeVision project The project must be created first Typically the wizard would be used, but this time we won t use it 20
Open CodeVision Normally, the most recent project worked on would be loaded In this case, no project had been opened 21
Choose NEW from the File Menu 22
Choose NEW from the File Menu This dialog box will open Choose project 23
Choose NEW from the File Menu This dialog box will open Choose project You will be asked if you want to use the Wizard Normally, click YES 24
The Wizard allows you to do many things Specify AVR Specify Clock speed Configure ports Provide project information Define interrupts and timers etc.. 25
We will choose NO (this time) because most of these parameters have been specified in the source file 26
The Configure Project Box appears 27
The Configure Project Box appears Click Add Choose source file (I had typed it in in WordPad and stored it in this directory) Click OPEN 28
The Configure Project Box appears Click Add The source file appears as part of the project 29
The Configure Project Box appears Click Add The source file appears as part of the project You may specify output directories 30
The Configure Project Box appears You can specify many parameters AVR Clock speed Memory model RAM size etc. 31
The source file appears 32
The source file appears I assumed the file was correct Chose Build All 33
The source file appears I assumed the file was correct Chose Build All You ll get information about your program 34
The source file appears I assumed the file was correct Chose Build All You ll get information about your program And the assembler output 35
Click OK 36
Click OK And click on the debugger.. 37
Click OK And click on the debugger AVR Studio is called (to run its simulator) 38
Choose OPEN 39
Choose OPEN And then choose the *.cof file that was created by CodeVision 40
Choose OPEN And then choose the *.cof file that was created by CodeVision Then AVR Studio prompts you to save its project file Click SAVE 41
Choose AVR and AVR Simulator 42
Choose AVR and AVR Simulator Click finish The simulator (debugger) starts automatically 43
You ll want to watch the variables and registers (how else would you know if your program is working) 44
From the VIEW Menu choose Watch 45
From the VIEW Menu choose Watch The watch window opens 46
Double click on the slots in the NAME column Type in the names of the variables you want to watch 47
You may also want to watch the registers or memory Click on VIEW registers 48
The register window opens 49
You may also want to view the ports Click the + next to I/O ATMEGA128 And then the + next to PORTA and PORTB 50
Finally, set break points (variables will not be updated will running the program) 51
Click RUN. 52
Click RUN and the program will run to the 1 st break point 53
Click RUN and the program will run to the 1 st break point The do/while loop will continue as long as PINA.0 =0 54
A few iterations later, the values have changed for the variables 55
A few iterations later, the values have changed for the variables Set PINA.0 and the program will continue 56
We could also insert some other instructions to test the output For example: Instead of printf () commands we could set bits in PortB Or declare a few other variables to set or clear under specific circumstances 57
Summary We worked through a complete example using CodeVision and AVR Studio Saw a few creative instructions ex: first ^=seed>>1; Discussed and used #define and #include Ports Read ports Wrote to ports Used some of the control statements learned in the last topic 58