tixiv
16 years ago
5 changed files with 388 additions and 5 deletions
@ -0,0 +1,280 @@ |
|||||
|
|
||||
|
#include "../config.h" |
||||
|
#include "../makros.h" |
||||
|
|
||||
|
#include <avr/interrupt.h> |
||||
|
#include <avr/io.h> |
||||
|
#include <avr/wdt.h> |
||||
|
#include "borg_hw.h" |
||||
|
|
||||
|
/*
|
||||
|
// Diese #defines werden nun durch menuconfig gesetzt
|
||||
|
|
||||
|
// 16 Spalten insgesamt direkt gesteuert, dafür 2 Ports
|
||||
|
#define COLPORT1 PORTC |
||||
|
#define COLDDR1 DDRC |
||||
|
|
||||
|
#define COLPORT2 PORTA |
||||
|
#define COLDDR2 DDRA |
||||
|
|
||||
|
// Der andere Port übernimmt die Steuerung der Schieberegister
|
||||
|
#define ROWPORT PORTD |
||||
|
#define ROWDDR DDRD |
||||
|
// Clock und reset gehen gemeinsam an beide Schieberegister
|
||||
|
// der reset pin ist negiert
|
||||
|
#define PIN_MCLR PD4 |
||||
|
#define PIN_CLK PD6 |
||||
|
//das dier sind die individuellen Dateneingänge für die Schieberegister
|
||||
|
#define PIN_DATA PD7 |
||||
|
*/ |
||||
|
|
||||
|
//#define COLDDR1 DDR(COLPORT1)
|
||||
|
//#define COLDDR2 DDR(COLPORT2)
|
||||
|
//#define ROWDDR DDR(ROWPORT)
|
||||
|
|
||||
|
#define DATAPORT PORTC |
||||
|
#define DATADDR DDR(DATAPORT) |
||||
|
|
||||
|
#define ADDRPORT PORTA |
||||
|
#define ADDRDDR DDR(ADDRPORT) |
||||
|
|
||||
|
#define CTRLPORT PORTD |
||||
|
#define CTRLDDR DDR(CTRLPORT) |
||||
|
|
||||
|
#define BIT_CS0 2 |
||||
|
#define BIT_CS1 3 |
||||
|
#define BIT_CS2 4 |
||||
|
#define BIT_CS3 5 |
||||
|
|
||||
|
#define BIT_RW 6 |
||||
|
|
||||
|
//Der Puffer, in dem das aktuelle Bild gespeichert wird
|
||||
|
unsigned char pixmap[NUMPLANE][NUM_ROWS][LINEBYTES]; |
||||
|
|
||||
|
|
||||
|
|
||||
|
inline void pd1165_write(uint8_t addr, uint8_t data){ |
||||
|
ADDRPORT = (ADDRPORT & 0xf0) | addr; |
||||
|
|
||||
|
DATAPORT = data; |
||||
|
/*
|
||||
|
switch (display){ |
||||
|
case 0: |
||||
|
CTRLPORT &= ~((1<<BIT_CS0)|(1<<BIT_RW)); |
||||
|
CTRLPORT |= ((1<<BIT_CS0)); |
||||
|
break; |
||||
|
case 1: |
||||
|
CTRLPORT &= ~((1<<BIT_CS1)|(1<<BIT_RW)); |
||||
|
CTRLPORT |= ((1<<BIT_CS1)); |
||||
|
break; |
||||
|
case 2: |
||||
|
CTRLPORT &= ~((1<<BIT_CS2)|(1<<BIT_RW)); |
||||
|
CTRLPORT |= ((1<<BIT_CS2)); |
||||
|
break; |
||||
|
case 3: |
||||
|
CTRLPORT &= ~((1<<BIT_CS3)|(1<<BIT_RW)); |
||||
|
CTRLPORT |= ((1<<BIT_CS3)); |
||||
|
break; |
||||
|
|
||||
|
} |
||||
|
*/ |
||||
|
} |
||||
|
|
||||
|
|
||||
|
/*
|
||||
|
//Eine Zeile anzeigen
|
||||
|
inline void rowshow(unsigned char row, unsigned char plane){ |
||||
|
int addr = row; |
||||
|
//Je nachdem, welche der Ebenen wir Zeichnen, die Zeile verschieden lange Anzeigen
|
||||
|
switch (plane){ |
||||
|
case 0: |
||||
|
OCR0 = 3; |
||||
|
break; |
||||
|
case 1: |
||||
|
OCR0 = 4; |
||||
|
break; |
||||
|
case 2: |
||||
|
OCR0 = 22; |
||||
|
} |
||||
|
|
||||
|
uint8_t tmp, tmp1; |
||||
|
//die Daten für die aktuelle Zeile auf die Spaltentreiber ausgeben
|
||||
|
|
||||
|
#ifndef INTERLACED_ROWS |
||||
|
tmp = pixmap[plane][row][0]; |
||||
|
tmp1 = pixmap[plane][row][1]; |
||||
|
#else |
||||
|
row = (row>>1) + ((row & 0x01)?8:0 ); |
||||
|
tmp = pixmap[plane][row][0]; |
||||
|
tmp1 = pixmap[plane][row][1]; |
||||
|
#endif |
||||
|
#ifdef REVERSE_COLS |
||||
|
tmp = (tmp >> 4) | (tmp << 4); |
||||
|
tmp = ((tmp & 0xcc) >> 2) | ((tmp & 0x33)<< 2); //0xcc = 11001100, 0x33 = 00110011
|
||||
|
tmp = ((tmp & 0xaa) >> 1) | ((tmp & 0x55)<< 1); //0xaa = 10101010, 0x55 = 1010101
|
||||
|
//COLPORT2 = tmp;
|
||||
|
tmp = tmp1; |
||||
|
tmp = (tmp >> 4) | (tmp << 4); |
||||
|
tmp = ((tmp & 0xcc) >> 2) | ((tmp & 0x33) << 2); //0xcc = 11001100, 0x33 = 00110011
|
||||
|
tmp = ((tmp & 0xaa) >> 1) | ((tmp & 0x55) << 1); //0xaa = 10101010, 0x55 = 1010101
|
||||
|
//COLPORT1 = tmp;
|
||||
|
#else |
||||
|
#ifdef INTERLACED_COLS |
||||
|
static uint8_t interlace_table[16] = { |
||||
|
0x00, 0x01, 0x04, 0x05, 0x10, 0x11, 0x14, 0x15, 0x40, 0x41, 0x44, 0x45, 0x50, 0x51, 0x54, 0x55 |
||||
|
}; |
||||
|
//COLPORT1 = interlace_table[tmp&0x0f] | (interlace_table[tmp1&0x0f]<<1);
|
||||
|
tmp>>=4; tmp1>>=4; |
||||
|
//COLPORT2 = interlace_table[tmp] | (interlace_table[tmp1]<<1);
|
||||
|
#else |
||||
|
//COLPORT1 = tmp;
|
||||
|
//COLPORT2 = tmp1;
|
||||
|
|
||||
|
pd1165_write(row, tmp); |
||||
|
|
||||
|
|
||||
|
#endif |
||||
|
#endif |
||||
|
|
||||
|
} |
||||
|
*/ |
||||
|
|
||||
|
//Dieser Interrupt wird je nach Ebene mit 50kHz 31,25kHz oder 12,5kHz ausgeführt
|
||||
|
SIGNAL(SIG_OUTPUT_COMPARE0) |
||||
|
{ |
||||
|
static unsigned char plane = 0; |
||||
|
unsigned char row = 0; |
||||
|
|
||||
|
//Watchdog zurücksetzen
|
||||
|
wdt_reset(); |
||||
|
|
||||
|
for(row=0; row < 8; row++){ |
||||
|
pd1165_write(row, pixmap[plane][row][0]); |
||||
|
CTRLPORT &= ~((1<<BIT_CS3)|(1<<BIT_RW)); |
||||
|
CTRLPORT |= ((1<<BIT_CS3)); |
||||
|
|
||||
|
pd1165_write(row, pixmap[plane][row][1]); |
||||
|
CTRLPORT &= ~((1<<BIT_CS2)|(1<<BIT_RW)); |
||||
|
CTRLPORT |= ((1<<BIT_CS2)); |
||||
|
|
||||
|
//pd1165_write(0, row, pixmap[plane][row][0]);
|
||||
|
//pd1165_write(1, row, pixmap[plane][row][1]);
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
for(row=8; row < NUM_ROWS; row++){ |
||||
|
pd1165_write(row-8, pixmap[plane][row][0]); |
||||
|
CTRLPORT &= ~((1<<BIT_CS0)|(1<<BIT_RW)); |
||||
|
CTRLPORT |= ((1<<BIT_CS0)); |
||||
|
|
||||
|
pd1165_write(row-8, pixmap[plane][row][1]); |
||||
|
CTRLPORT &= ~((1<<BIT_CS1)|(1<<BIT_RW)); |
||||
|
CTRLPORT |= ((1<<BIT_CS1)); |
||||
|
} |
||||
|
|
||||
|
//Je nachdem, welche der Ebenen wir Zeichnen, die Zeile verschieden lange Anzeigen
|
||||
|
switch (plane){ |
||||
|
case 0: |
||||
|
OCR0 = 3; |
||||
|
break; |
||||
|
case 1: |
||||
|
OCR0 = 4; |
||||
|
break; |
||||
|
case 2: |
||||
|
OCR0 = 22; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
//Zeile und Ebene inkrementieren
|
||||
|
if(++plane==NUMPLANE){ |
||||
|
plane=0; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void timer0_off(){ |
||||
|
cli(); |
||||
|
|
||||
|
COLPORT1 = 0; |
||||
|
COLPORT2 = 0; |
||||
|
ROWPORT = 0; |
||||
|
|
||||
|
TCCR0 = 0x00; |
||||
|
sei(); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
// Den Timer, der denn Interrupt auslöst, initialisieren
|
||||
|
void timer0_on(){ |
||||
|
/* TCCR0: FOC0 WGM00 COM01 COM00 WGM01 CS02 CS01 CS00
|
||||
|
CS02 CS01 CS00 |
||||
|
0 0 0 stop |
||||
|
0 0 1 clk |
||||
|
0 1 0 clk/8 |
||||
|
0 1 1 clk/64 |
||||
|
1 0 0 clk/256 |
||||
|
1 0 1 clk/1024 |
||||
|
|
||||
|
*/ |
||||
|
TCCR0 = 0x0D; // CTC Mode, clk/64
|
||||
|
TCNT0 = 0; // reset timer
|
||||
|
OCR0 = 20; // Compare with this value
|
||||
|
TIMSK = 0x02; // Compare match Interrupt on
|
||||
|
} |
||||
|
|
||||
|
void timer2_on(){ |
||||
|
/* TCCR2: FOC2 WGM20 COM21 COM20 WGM21 CS22 CS21 CS20
|
||||
|
CS02 CS01 CS00 |
||||
|
0 0 0 stop |
||||
|
0 0 1 clk |
||||
|
0 1 0 clk/8 |
||||
|
0 1 1 clk/32 |
||||
|
1 0 0 clk/64 |
||||
|
1 0 1 clk/128 |
||||
|
1 1 0 clk/256 |
||||
|
1 1 1 clk/1024 |
||||
|
|
||||
|
|
||||
|
Table 51. Compare Output Mode, non-PWM Mode |
||||
|
COM21 COM20 Description |
||||
|
0 0 Normal port operation, OC2 disconnected. |
||||
|
0 1 Toggle OC2 on compare match |
||||
|
1 0 Clear OC2 on compare match |
||||
|
1 1 Set OC2 on compare match |
||||
|
|
||||
|
*/ |
||||
|
TCCR2 = (1<<WGM21) | (1<<COM20) | 1 ; //CTC, OC2 toggle, clk/1
|
||||
|
OCR2 = 100; //80kHz clock on OC2
|
||||
|
|
||||
|
} |
||||
|
|
||||
|
void borg_hw_init(){ |
||||
|
CTRLDDR = (1<<BIT_CS0)|(1<<BIT_CS1)|(1<<BIT_CS2)|(1<<BIT_CS3)|(1<<BIT_RW); |
||||
|
CTRLPORT = (1<<BIT_CS0)|(1<<BIT_CS1)|(1<<BIT_CS2)|(1<<BIT_CS3)|(1<<BIT_RW); |
||||
|
DATADDR = 0xff; |
||||
|
ADDRDDR |= 0x0f; |
||||
|
CTRLPORT = (1<<BIT_CS0)|(1<<BIT_CS1)|(1<<BIT_CS2)|(1<<BIT_CS3)|(1<<BIT_RW); |
||||
|
|
||||
|
|
||||
|
pd1165_write(8, 0x10 | 7); |
||||
|
|
||||
|
CTRLPORT &= ~((1<<BIT_CS0)|(1<<BIT_CS1)|(1<<BIT_CS2)|(1<<BIT_CS3)|(1<<BIT_RW)); |
||||
|
|
||||
|
CTRLPORT |= ((1<<BIT_CS0)|(1<<BIT_CS1)|(1<<BIT_CS2)|(1<<BIT_CS3)); |
||||
|
|
||||
|
|
||||
|
timer0_on(); |
||||
|
timer2_on(); |
||||
|
|
||||
|
DDRD |= 1<<PD7; //OC2 pin to output
|
||||
|
|
||||
|
PORTA |= (1<<PA4); |
||||
|
DDRA |= (1<<PA4); |
||||
|
|
||||
|
|
||||
|
PORTD |= (1<<PD7); |
||||
|
|
||||
|
//Watchdog Timer aktivieren
|
||||
|
wdt_reset(); |
||||
|
wdt_enable(0x00); // 17ms Watchdog
|
||||
|
} |
@ -0,0 +1,88 @@ |
|||||
|
mainmenu_option next_comment |
||||
|
comment "Borg16 port setup" |
||||
|
|
||||
|
#define COLPORT1 PORTC |
||||
|
#define COLDDR1 DDRC |
||||
|
|
||||
|
#define COLPORT2 PORTA |
||||
|
#define COLDDR2 DDRA |
||||
|
|
||||
|
#// Der andere Port übernimmt die Steuerung der Schieberegister |
||||
|
#define ROWPORT PORTD |
||||
|
#define ROWDDR DDRD |
||||
|
#// Clock und reset gehen gemeinsam an beide Schieberegister |
||||
|
#// der reset pin ist negiert |
||||
|
#define PIN_RST PD4 |
||||
|
#define PIN_CLK PD6 |
||||
|
#//das dier sind die individuellen Dateneingänge für die Schieberegister |
||||
|
#define PIN_SHFT1 PD7 |
||||
|
|
||||
|
|
||||
|
choice 'Column Port 1 (right)' \ |
||||
|
"PORTA PORTA \ |
||||
|
PORTB PORTB \ |
||||
|
PORTC PORTC \ |
||||
|
PORTD PORTD" \ |
||||
|
'PORTC' COLPORT1 |
||||
|
|
||||
|
choice 'Column Port 2 (left)' \ |
||||
|
"PORTA PORTA \ |
||||
|
PORTB PORTB \ |
||||
|
PORTC PORTC \ |
||||
|
PORTD PORTD" \ |
||||
|
'PORTA' COLPORT2 |
||||
|
|
||||
|
choice 'port for row shiftregisters' \ |
||||
|
"PORTA PORTA \ |
||||
|
PORTB PORTB \ |
||||
|
PORTC PORTC \ |
||||
|
PORTD PORTD" \ |
||||
|
'PORTD' ROWPORT |
||||
|
|
||||
|
comment "pin numbers on shiftregister port" |
||||
|
|
||||
|
choice '/MCLR Pin' \ |
||||
|
"Pin0 0 \ |
||||
|
Pin1 1 \ |
||||
|
Pin2 2 \ |
||||
|
Pin3 3 \ |
||||
|
Pin4 4 \ |
||||
|
Pin5 5 \ |
||||
|
Pin6 6 \ |
||||
|
Pin7 7" \ |
||||
|
'Pin4' PIN_MCLR |
||||
|
|
||||
|
choice 'CLK Pin' \ |
||||
|
"Pin0 0 \ |
||||
|
Pin1 1 \ |
||||
|
Pin2 2 \ |
||||
|
Pin3 3 \ |
||||
|
Pin4 4 \ |
||||
|
Pin5 5 \ |
||||
|
Pin6 6 \ |
||||
|
Pin7 7" \ |
||||
|
'Pin6' PIN_CLK |
||||
|
|
||||
|
choice 'DATA Pin' \ |
||||
|
"Pin0 0 \ |
||||
|
Pin1 1 \ |
||||
|
Pin2 2 \ |
||||
|
Pin3 3 \ |
||||
|
Pin4 4 \ |
||||
|
Pin5 5 \ |
||||
|
Pin6 6 \ |
||||
|
Pin7 7" \ |
||||
|
'Pin7' PIN_DATA |
||||
|
|
||||
|
comment "fixing hardwareproblems in software" |
||||
|
|
||||
|
|
||||
|
bool "reverse cols" REVERSE_COLS n |
||||
|
bool "invert rows " INVERT_ROWS n |
||||
|
|
||||
|
comment "for borg jacket" |
||||
|
|
||||
|
bool "interlaced rows" INTERLACED_ROWS n |
||||
|
bool "interlaced cols" INTERLACED_COLS n |
||||
|
|
||||
|
endmenu |
Loading…
Reference in new issue