Problem with comparison.
/Designs/Oscilloscope/DOC/stav.txt |
---|
0,0 → 1,10 |
Zatim je zprovezneno zakladni samplovani a binarni data transfer na strane atmegy a |
prijem a zobrazeni dat na strane PC. Ovladani uz nejak vypada. |
Dal: |
Zakladni dokumentace. Nakreslit zapojeni modulu a analogove cesty. |
Nastavitelny time base. Mereni time base pomoci timeru. |
Musim vykrast trigger ze sveho starsiho projektu. |
Oboustrana komunikace. |
Zlepsit uroven kodu qscope.... |
/Designs/Oscilloscope/SW/PC_side/qscope/main.cpp |
---|
0,0 → 1,33 |
// qscope, Roman Pavelka, 2011 |
#include <QApplication> |
#include <QPushButton> |
#include <QVBoxLayout> |
#include "scope.h" |
class Window : public QWidget |
{ |
public: |
Window(QWidget *parent = 0); |
}; |
Window::Window(QWidget *parent) |
: QWidget(parent) |
{ |
Scope *scope = new Scope; |
QVBoxLayout *layout = new QVBoxLayout; |
layout->addWidget(scope); |
setLayout(layout); |
} |
int main(int argc, char *argv[]) |
{ |
QApplication app(argc, argv); |
Window window; |
window.setGeometry(500, 100, 460, 740); |
window.show(); |
return app.exec(); |
} |
/Designs/Oscilloscope/SW/PC_side/qscope/moc_scope.cpp |
---|
0,0 → 1,84 |
/**************************************************************************** |
** Meta object code from reading C++ file 'scope.h' |
** |
** Created: Mon Aug 15 00:34:35 2011 |
** by: The Qt Meta Object Compiler version 62 (Qt 4.7.2) |
** |
** WARNING! All changes made in this file will be lost! |
*****************************************************************************/ |
#include "scope.h" |
#if !defined(Q_MOC_OUTPUT_REVISION) |
#error "The header file 'scope.h' doesn't include <QObject>." |
#elif Q_MOC_OUTPUT_REVISION != 62 |
#error "This file was generated using the moc from 4.7.2. It" |
#error "cannot be used with the include files from this version of Qt." |
#error "(The moc has changed too much.)" |
#endif |
QT_BEGIN_MOC_NAMESPACE |
static const uint qt_meta_data_Scope[] = { |
// content: |
5, // revision |
0, // classname |
0, 0, // classinfo |
3, 14, // methods |
0, 0, // properties |
0, 0, // enums/sets |
0, 0, // constructors |
0, // flags |
0, // signalCount |
// slots: signature, parameters, type, tag, flags |
7, 6, 6, 6, 0x0a, |
21, 17, 6, 6, 0x0a, |
35, 17, 6, 6, 0x0a, |
0 // eod |
}; |
static const char qt_meta_stringdata_Scope[] = { |
"Scope\0\0getData()\0val\0setScale(int)\0" |
"setShift(int)\0" |
}; |
const QMetaObject Scope::staticMetaObject = { |
{ &QWidget::staticMetaObject, qt_meta_stringdata_Scope, |
qt_meta_data_Scope, 0 } |
}; |
#ifdef Q_NO_DATA_RELOCATION |
const QMetaObject &Scope::getStaticMetaObject() { return staticMetaObject; } |
#endif //Q_NO_DATA_RELOCATION |
const QMetaObject *Scope::metaObject() const |
{ |
return QObject::d_ptr->metaObject ? QObject::d_ptr->metaObject : &staticMetaObject; |
} |
void *Scope::qt_metacast(const char *_clname) |
{ |
if (!_clname) return 0; |
if (!strcmp(_clname, qt_meta_stringdata_Scope)) |
return static_cast<void*>(const_cast< Scope*>(this)); |
return QWidget::qt_metacast(_clname); |
} |
int Scope::qt_metacall(QMetaObject::Call _c, int _id, void **_a) |
{ |
_id = QWidget::qt_metacall(_c, _id, _a); |
if (_id < 0) |
return _id; |
if (_c == QMetaObject::InvokeMetaMethod) { |
switch (_id) { |
case 0: getData(); break; |
case 1: setScale((*reinterpret_cast< int(*)>(_a[1]))); break; |
case 2: setShift((*reinterpret_cast< int(*)>(_a[1]))); break; |
default: ; |
} |
_id -= 3; |
} |
return _id; |
} |
QT_END_MOC_NAMESPACE |
/Designs/Oscilloscope/SW/PC_side/qscope/qscope |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:executable |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/Oscilloscope/SW/PC_side/qscope/scope.cpp |
---|
0,0 → 1,151 |
#include "scope.h" |
#include <QPainter> |
#include <QString> |
#include <iostream> |
#include <stdio.h> |
using namespace std; |
void UI(void); |
Scope::Scope(QWidget *parent) { // CONSTRUCTOR, graphic stuff |
dataAquired=0; |
// data=new int[LEN*sizeof(int)]; ; |
int i; |
for(i=0;i<LEN;i++) // buffer init |
data[i]=0; |
scale=DEF_SCALE; // default coords: data[i] = (data[i] + shift)/scale; |
shift=DEF_SHIFT; |
scaleSlider = new QSlider(Qt::Horizontal,this); |
scaleSlider->setRange(1, 256); |
scaleSlider->setValue(DEF_SCALE); |
connect(scaleSlider, SIGNAL(valueChanged(int)), this, SLOT(setScale(int))); |
shiftSlider = new QSlider(Qt::Horizontal,this); |
shiftSlider->setRange(0, +60000); |
shiftSlider->setValue(DEF_SHIFT); |
connect(shiftSlider, SIGNAL(valueChanged(int)), this, SLOT(setShift(int))); |
updateTimer = new QTimer(this); |
updateTimer->start(TICK); |
connect(updateTimer, SIGNAL(timeout()), this, SLOT(getData())); |
labels[1] = new QLabel(this); |
/*QString tempStr; |
tempStr.setNum(shift); |
labels[1]->setText("Zero level: " + tempStr); |
labels[1]->setGeometry (20, 550, 200, 20); |
labels[1]->show(); |
shiftSlider->setGeometry(QRect(20,580,400,60)); |
shiftSlider->show();*/ |
labels[2] = new QLabel(this); |
this->UI();/* |
tempStr.setNum(scale); |
labels[2]->setText("Divisor: " + tempStr); |
labels[2]->setGeometry (20, 630, 400, 20); |
labels[2]->show(); |
scaleSlider->setGeometry(QRect(20,660,400,60)); |
scaleSlider->show();*/ |
} |
void Scope::UI(void) { |
QString tempStr; |
tempStr.setNum(shift); |
labels[1]->setText("Zero level: " + tempStr); |
labels[1]->setGeometry (20, 550, 200, 20); |
labels[1]->show(); |
shiftSlider->setGeometry(QRect(20,580,400,60)); |
shiftSlider->show(); |
tempStr.setNum(scale); |
labels[2]->setText("Divisor: " + tempStr); |
labels[2]->setGeometry (20, 630, 400, 20); |
labels[2]->show(); |
scaleSlider->setGeometry(QRect(20,660,400,60)); |
scaleSlider->show(); |
} |
Scope::~Scope() { |
delete [] data; |
} |
void Scope::paintEvent(QPaintEvent* event) { |
QPainter painter(this); |
if (dataAquired) { |
painter.drawLine(LEFT-1,TOP,LEFT-1,TOP+HEIGHT); //vertical bound box lines |
painter.drawLine(LEFT+WIDTH+1,TOP,LEFT+WIDTH+1,TOP+HEIGHT); |
painter.drawLine(LEFT-1,TOP,LEFT+WIDTH+1,TOP); //horizontals bound box lines |
painter.drawLine(LEFT-1,TOP+HEIGHT,LEFT+WIDTH+1,TOP+HEIGHT); |
painter.drawLine(LEFT-1,TOP+HEIGHT/2,LEFT+WIDTH+1,TOP+HEIGHT/2); |
int i; |
for(i=0;i<LEN;i++) { |
data[i] = (data[i] - shift)/scale; |
} |
for(i=0;i<LEN-1;i++) { |
painter.drawLine(PIXPT_X*i+LEFT,TOP+HEIGHT/2-PIXPT_Y*data[i],PIXPT_X*(i+1)+LEFT,TOP+HEIGHT/2-data[i+1]*PIXPT_Y); |
} |
//cout << "Screen updated"<<endl; |
} |
} |
void Scope::getData() { |
char c='m'; |
cout << "Serial transfer start."<<endl; |
FILE *serial=fopen("/dev/ttyUSB0","r+"); |
if (serial==NULL) { |
cout << "Serial port error."<<endl; |
} else { |
//cout << "Serial port open."<<endl; |
fwrite(&c,sizeof(char),1,serial); // poprosime o data |
fread(buffer,sizeof(uint8_t),2*LEN,serial); // a berem je |
// cout << "Serial transfer completed."<<endl; |
fclose(serial); |
int i; |
for(i=0;i<LEN;i++) { |
data[i]=buffer[2*i]*256+buffer[2*i+1]; |
// cout << 1*data[i] <<endl; |
} |
// cout << "Screen updating...."<<endl; |
dataAquired=1; |
update(); |
} |
} |
void Scope::setScale(int val) { |
scale=val; |
UI(); |
} |
void Scope::setShift(int val) { |
shift=val; |
UI(); |
} |
/Designs/Oscilloscope/SW/PC_side/qscope/scope.h |
---|
0,0 → 1,55 |
#ifndef SCOPE_H |
#define SCOPE_H |
#include <QWidget> |
#include <QTimer> |
#include <QSlider> |
#include <stdint.h> |
#include <QLabel> |
#define TICK 250 // time in ms for one sample (LEN values) |
#define LEN 100 // number of sampled values |
#define DEF_SCALE 128 //divisor |
#define DEF_SHIFT 37203 |
#define LEFT 10 |
#define TOP 10 |
#define PIXPT_X 4 |
#define PIXPT_Y 1 |
#define WIDTH (PIXPT_X*LEN) |
#define HEIGHT (PIXPT_Y*512) |
class Scope : public QWidget |
{ |
Q_OBJECT |
public: |
Scope(QWidget *parent = 0); |
~Scope(); |
public slots: |
void getData(); |
void setScale(int val); |
void setShift(int val); |
protected: |
void paintEvent(QPaintEvent *event); |
private: |
uint8_t buffer[2*LEN]; |
int data[LEN]; |
char dataAquired; |
void UI(void); |
int shift, scale; |
QTimer *updateTimer; |
QSlider *shiftSlider; |
QSlider *scaleSlider; |
QLabel * labels[5]; |
}; |
#endif |
/Designs/Oscilloscope/SW/PC_side/qscope/Makefile |
---|
0,0 → 1,218 |
############################################################################# |
# Makefile for building: qscope |
# Generated by qmake (2.01a) (Qt 4.7.2) on: Sun Aug 14 00:40:57 2011 |
# Project: qscope.pro |
# Template: app |
# Command: /usr/bin/qmake -o Makefile qscope.pro |
############################################################################# |
####### Compiler, tools and options |
CC = gcc |
CXX = g++ |
DEFINES = -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB -DQT_SHARED |
CFLAGS = -pipe -Wall -W -D_REENTRANT $(DEFINES) |
CXXFLAGS = -pipe -Wall -W -D_REENTRANT $(DEFINES) |
INCPATH = -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. |
LINK = g++ |
LFLAGS = -Wl,-O1 -Wl,-rpath,/usr/lib/qt4 |
LIBS = $(SUBLIBS) -L/usr/lib/qt4 -lQtGui -L/usr/lib/qt4 -L/usr/X11R6/lib -lQtCore -lgthread-2.0 -lrt -lglib-2.0 -lpthread |
AR = ar cqs |
RANLIB = |
QMAKE = /usr/bin/qmake |
TAR = tar -cf |
COMPRESS = gzip -9f |
COPY = cp -f |
SED = sed |
COPY_FILE = $(COPY) |
COPY_DIR = $(COPY) -r |
STRIP = strip |
INSTALL_FILE = install -m 644 -p |
INSTALL_DIR = $(COPY_DIR) |
INSTALL_PROGRAM = install -m 755 -p |
DEL_FILE = rm -f |
SYMLINK = ln -f -s |
DEL_DIR = rmdir |
MOVE = mv -f |
CHK_DIR_EXISTS= test -d |
MKDIR = mkdir -p |
####### Output directory |
OBJECTS_DIR = ./ |
####### Files |
SOURCES = main.cpp \ |
scope.cpp moc_scope.cpp |
OBJECTS = main.o \ |
scope.o \ |
moc_scope.o |
DIST = /usr/share/qt4/mkspecs/common/g++.conf \ |
/usr/share/qt4/mkspecs/common/unix.conf \ |
/usr/share/qt4/mkspecs/common/linux.conf \ |
/usr/share/qt4/mkspecs/qconfig.pri \ |
/usr/share/qt4/mkspecs/modules/qt_phonon.pri \ |
/usr/share/qt4/mkspecs/modules/qt_webkit_version.pri \ |
/usr/share/qt4/mkspecs/features/qt_functions.prf \ |
/usr/share/qt4/mkspecs/features/qt_config.prf \ |
/usr/share/qt4/mkspecs/features/exclusive_builds.prf \ |
/usr/share/qt4/mkspecs/features/default_pre.prf \ |
/usr/share/qt4/mkspecs/features/release.prf \ |
/usr/share/qt4/mkspecs/features/default_post.prf \ |
/usr/share/qt4/mkspecs/features/warn_on.prf \ |
/usr/share/qt4/mkspecs/features/qt.prf \ |
/usr/share/qt4/mkspecs/features/unix/thread.prf \ |
/usr/share/qt4/mkspecs/features/moc.prf \ |
/usr/share/qt4/mkspecs/features/resources.prf \ |
/usr/share/qt4/mkspecs/features/uic.prf \ |
/usr/share/qt4/mkspecs/features/yacc.prf \ |
/usr/share/qt4/mkspecs/features/lex.prf \ |
/usr/share/qt4/mkspecs/features/include_source_dir.prf \ |
qscope.pro |
QMAKE_TARGET = qscope |
DESTDIR = |
TARGET = qscope |
first: all |
####### Implicit rules |
.SUFFIXES: .o .c .cpp .cc .cxx .C |
.cpp.o: |
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" |
.cc.o: |
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" |
.cxx.o: |
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" |
.C.o: |
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<" |
.c.o: |
$(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<" |
####### Build rules |
all: Makefile $(TARGET) |
$(TARGET): $(OBJECTS) |
$(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS) |
Makefile: qscope.pro /usr/share/qt4/mkspecs/linux-g++/qmake.conf /usr/share/qt4/mkspecs/common/g++.conf \ |
/usr/share/qt4/mkspecs/common/unix.conf \ |
/usr/share/qt4/mkspecs/common/linux.conf \ |
/usr/share/qt4/mkspecs/qconfig.pri \ |
/usr/share/qt4/mkspecs/modules/qt_phonon.pri \ |
/usr/share/qt4/mkspecs/modules/qt_webkit_version.pri \ |
/usr/share/qt4/mkspecs/features/qt_functions.prf \ |
/usr/share/qt4/mkspecs/features/qt_config.prf \ |
/usr/share/qt4/mkspecs/features/exclusive_builds.prf \ |
/usr/share/qt4/mkspecs/features/default_pre.prf \ |
/usr/share/qt4/mkspecs/features/release.prf \ |
/usr/share/qt4/mkspecs/features/default_post.prf \ |
/usr/share/qt4/mkspecs/features/warn_on.prf \ |
/usr/share/qt4/mkspecs/features/qt.prf \ |
/usr/share/qt4/mkspecs/features/unix/thread.prf \ |
/usr/share/qt4/mkspecs/features/moc.prf \ |
/usr/share/qt4/mkspecs/features/resources.prf \ |
/usr/share/qt4/mkspecs/features/uic.prf \ |
/usr/share/qt4/mkspecs/features/yacc.prf \ |
/usr/share/qt4/mkspecs/features/lex.prf \ |
/usr/share/qt4/mkspecs/features/include_source_dir.prf \ |
/usr/lib/qt4/libQtGui.prl \ |
/usr/lib/qt4/libQtCore.prl |
$(QMAKE) -o Makefile qscope.pro |
/usr/share/qt4/mkspecs/common/g++.conf: |
/usr/share/qt4/mkspecs/common/unix.conf: |
/usr/share/qt4/mkspecs/common/linux.conf: |
/usr/share/qt4/mkspecs/qconfig.pri: |
/usr/share/qt4/mkspecs/modules/qt_phonon.pri: |
/usr/share/qt4/mkspecs/modules/qt_webkit_version.pri: |
/usr/share/qt4/mkspecs/features/qt_functions.prf: |
/usr/share/qt4/mkspecs/features/qt_config.prf: |
/usr/share/qt4/mkspecs/features/exclusive_builds.prf: |
/usr/share/qt4/mkspecs/features/default_pre.prf: |
/usr/share/qt4/mkspecs/features/release.prf: |
/usr/share/qt4/mkspecs/features/default_post.prf: |
/usr/share/qt4/mkspecs/features/warn_on.prf: |
/usr/share/qt4/mkspecs/features/qt.prf: |
/usr/share/qt4/mkspecs/features/unix/thread.prf: |
/usr/share/qt4/mkspecs/features/moc.prf: |
/usr/share/qt4/mkspecs/features/resources.prf: |
/usr/share/qt4/mkspecs/features/uic.prf: |
/usr/share/qt4/mkspecs/features/yacc.prf: |
/usr/share/qt4/mkspecs/features/lex.prf: |
/usr/share/qt4/mkspecs/features/include_source_dir.prf: |
/usr/lib/qt4/libQtGui.prl: |
/usr/lib/qt4/libQtCore.prl: |
qmake: FORCE |
@$(QMAKE) -o Makefile qscope.pro |
dist: |
@$(CHK_DIR_EXISTS) .tmp/qscope1.0.0 || $(MKDIR) .tmp/qscope1.0.0 |
$(COPY_FILE) --parents $(SOURCES) $(DIST) .tmp/qscope1.0.0/ && $(COPY_FILE) --parents scope.h .tmp/qscope1.0.0/ && $(COPY_FILE) --parents main.cpp scope.cpp .tmp/qscope1.0.0/ && (cd `dirname .tmp/qscope1.0.0` && $(TAR) qscope1.0.0.tar qscope1.0.0 && $(COMPRESS) qscope1.0.0.tar) && $(MOVE) `dirname .tmp/qscope1.0.0`/qscope1.0.0.tar.gz . && $(DEL_FILE) -r .tmp/qscope1.0.0 |
clean:compiler_clean |
-$(DEL_FILE) $(OBJECTS) |
-$(DEL_FILE) *~ core *.core |
####### Sub-libraries |
distclean: clean |
-$(DEL_FILE) $(TARGET) |
-$(DEL_FILE) Makefile |
check: first |
mocclean: compiler_moc_header_clean compiler_moc_source_clean |
mocables: compiler_moc_header_make_all compiler_moc_source_make_all |
compiler_moc_header_make_all: moc_scope.cpp |
compiler_moc_header_clean: |
-$(DEL_FILE) moc_scope.cpp |
moc_scope.cpp: scope.h |
/usr/bin/moc $(DEFINES) $(INCPATH) scope.h -o moc_scope.cpp |
compiler_rcc_make_all: |
compiler_rcc_clean: |
compiler_image_collection_make_all: qmake_image_collection.cpp |
compiler_image_collection_clean: |
-$(DEL_FILE) qmake_image_collection.cpp |
compiler_moc_source_make_all: |
compiler_moc_source_clean: |
compiler_uic_make_all: |
compiler_uic_clean: |
compiler_yacc_decl_make_all: |
compiler_yacc_decl_clean: |
compiler_yacc_impl_make_all: |
compiler_yacc_impl_clean: |
compiler_lex_make_all: |
compiler_lex_clean: |
compiler_clean: compiler_moc_header_clean |
####### Compile |
main.o: main.cpp scope.h |
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o main.o main.cpp |
scope.o: scope.cpp scope.h |
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o scope.o scope.cpp |
moc_scope.o: moc_scope.cpp |
$(CXX) -c $(CXXFLAGS) $(INCPATH) -o moc_scope.o moc_scope.cpp |
####### Install |
install: FORCE |
uninstall: FORCE |
FORCE: |
/Designs/Oscilloscope/SW/PC_side/qscope/qscope.pro |
---|
0,0 → 1,12 |
###################################################################### |
# Automatically generated by qmake (2.01a) Sun Aug 14 00:40:56 2011 |
###################################################################### |
TEMPLATE = app |
TARGET = |
DEPENDPATH += . |
INCLUDEPATH += . |
# Input |
HEADERS += scope.h |
SOURCES += main.cpp scope.cpp |
/Designs/Oscilloscope/SW/PC_side/stty_setting |
---|
0,0 → 1,0 |
stty -F /dev/ttyUSB0 1000000 raw -hupcl -echo -echok -echoctl |
/Designs/Oscilloscope/SW/firmware/Makefile |
---|
0,0 → 1,33 |
PRG = scope |
OBJ = main.o ./libs/usart.o ./libs/spi.o |
MCU_TARGET = atmega8 |
AVRDUDE_PART = m8 |
OPTIMIZE = -O1 |
# OPTIMIZE = -Os |
CC = avr-gcc |
override CFLAGS = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) $(DEFS) |
OBJCOPY = avr-objcopy |
OBJDUMP = avr-objdump |
all: hex |
./libs/spi.o: ./libs/spi.h |
./libs/usart.o: ./libs/usart.h |
#./libs/timer.o: ./libs/timer.h |
hex: $(PRG).hex |
%.hex: %.elf |
$(OBJCOPY) -j .text -j .data -O ihex $< $@ |
$(PRG).elf: $(OBJ) |
$(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS) |
load: $(PRG).hex |
avrdude -p $(AVRDUDE_PART) -c stk500v2 -P /dev/ttyUSB1 -B 2 -U flash:w:$< |
clean: |
rm -rf *.o $(PRG).elf $(PRG).hex ./libs/*.o |
Property changes: |
Added: svn:executable |
/Designs/Oscilloscope/SW/firmware/libs/spi.c |
---|
0,0 → 1,20 |
#include "spi.h" |
#include <avr/io.h> |
void SPI_MasterInit(void) |
{ |
/* Enable SPI, Master, set clock rate fck/4, SCK high when idle, sample on rising */ |
// SPSR|= 0b00000001; //for fck/2 |
SPCR = 0b01011100; |
} |
char SPI_MasterTransmit(char cData) { |
/* Start transmission */ |
SPDR = cData; |
/* Wait for transmission complete */ |
while(!(SPSR & (1<<SPIF))) |
; |
return SPDR; |
} |
/Designs/Oscilloscope/SW/firmware/libs/spi.h |
---|
0,0 → 1,7 |
#ifndef SPI_H |
#define SPI_H |
void SPI_MasterInit(void); |
char SPI_MasterTransmit(char cData); |
#endif |
/Designs/Oscilloscope/SW/firmware/libs/usart.c |
---|
0,0 → 1,128 |
#include "usart.h" |
#include <avr/io.h> |
void USART_Init( unsigned int ubrr) |
{ |
/* Set baud rate */ |
UBRRH = (unsigned char)(ubrr>>8); |
UBRRL = (unsigned char)ubrr; |
/* flush transmitt register Double speed */ |
UCSRA = (1<<UDRE)|(1 << U2X); |
/* enable receiver interrupt and transmitter, pins forced */ |
UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN); |
/* Asynchronous, no parity, Set frame format: 8data, 1stop bit */ |
UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1); |
} |
void USART_Transmit( unsigned char data ) |
{ |
while ( !( UCSRA & (1<<UDRE)) ); /* Wait for empty transmit buffer */ |
UDR = data; /* Put data into buffer, sends the data */ |
} |
void USART_Transmit_string( char *data ) |
{ |
while ( *data != 0 ) { |
USART_Transmit(*data); |
data++; |
} |
} |
void USART_Transmit_longnum(signed long data ) { |
unsigned char digits[10],i; |
if (data==0) |
USART_Transmit('0'); |
else { // PROZKOUMAT! |
if (data<0) { |
USART_Transmit('-'); |
data*=-1; |
} |
for (i=0;i<10;i++) { |
digits[i]=data%10; |
data=data/10; |
} |
i=9; |
while (digits[i]==0) i--; |
while (i>0) { |
USART_Transmit(digits[i]+48); |
i--; |
} |
USART_Transmit(digits[0]+48); |
} |
} |
void USART_Transmit_uint16 (unsigned int data ) { |
unsigned char digits[5],i; |
if (data==0) //podivne, ale nulu to odeslat neumi |
USART_Transmit('0'); |
else { |
for (i=0;i<5;i++) { |
digits[i]=data%10; |
data=data/10; |
} |
i=4; |
while (digits[i]==0) i--; |
while (i>0) { |
USART_Transmit(digits[i]+48); |
i--; |
} |
USART_Transmit(digits[0]+48); |
} |
} |
void USART_Transmit_num(unsigned char data ) { |
unsigned char a,b,c; |
c=data%10; |
data=data/10; |
b=data%10; |
data=data/10; |
a=data%10; |
USART_Transmit(a+48); |
USART_Transmit(b+48); |
USART_Transmit(c+48); |
} |
/*void USART_Transmit_float( float data ) { |
int a,b,c; |
c=((int)data)%10; |
b=((int)(data/10))%10; |
a=((int)(data/100))%10; |
USART_Transmit(a+48); |
USART_Transmit(b+48); |
USART_Transmit(c+48); |
}*/ |
void USART_Transmit_byte( char data ) { |
unsigned char i; |
i=0b10000000; |
while (i) { |
USART_Transmit( ( (i&data)&&1 ) + 48 ); |
i>>=1; |
} |
} |
/Designs/Oscilloscope/SW/firmware/libs/usart.h |
---|
0,0 → 1,17 |
#ifndef USART_H |
#define USART_H |
//Inits: |
void USART_Init( unsigned int ubrr); // 8b, no parity, 1 stop |
// asynchronous, RX interrupt |
// Busy loops: |
void USART_Transmit( unsigned char data ); // send char (1B) |
void USART_Transmit_string( char *data ); // send string |
void USART_Transmit_num( unsigned char data ); // send ascii |
void USART_Transmit_longnum( signed long data ); // send ascii |
void USART_Transmit_uint16( unsigned int data ); // send ascii |
//void USART_Transmit_float( float data ); |
void USART_Transmit_byte( char data ); //send in ascii hex reprezentation |
#endif |
/Designs/Oscilloscope/SW/firmware/main.c |
---|
0,0 → 1,79 |
// Oscilloscope firmware, Roman Pavelka, 2011 |
// written for atmega8 |
#define F_CPU 16000000 |
#define BAUD 1000000 |
//#define MYUBRR F_CPU/8/BAUD-1 |
#define MYUBRR 1 |
#include "./libs/usart.h" |
#include "./libs/spi.h" |
#include <avr/io.h> |
#include <avr/interrupt.h> |
#include <util/delay.h> |
#include <inttypes.h> |
#define LEN 100 |
uint8_t data[2*LEN]; |
void measure(void); |
void send(void); |
int main (void) { |
USART_Init(MYUBRR); |
DDRB = 0b00100100; //SCK, SS out |
PORTB = 0b00000000; // CONV low |
SPI_MasterInit(); |
sei(); |
while(1) {} |
return 0; |
} |
void measure(void) { |
uint8_t i; |
for(i=0;i<LEN;i++) { |
PORTB |= 0b00000100; |
_delay_us(4); |
PORTB &= 0b11111011; //one conversion |
data[2*i] = SPI_MasterTransmit(0x0); |
data[2*i+1] = SPI_MasterTransmit(0x0); |
} |
} |
void send(void) { |
uint8_t i; |
for(i=0;i<LEN;i++) { |
/* USART_Transmit_uint16(data[i]); //ASCII transfer |
USART_Transmit('\n');*/ |
USART_Transmit(data[2*i]); //Binary transfer |
USART_Transmit(data[2*i+1]); |
// USART_Transmit('\n'); |
} |
} |
ISR(USART_RXC_vect) { |
char data; |
data=UDR; //must be read to untrigger interupt |
if (data=='m') { |
measure(); |
send(); |
} |
} |
/Designs/Oscilloscope/SW/firmware/scope.elf |
---|
Cannot display: file marked as a binary type. |
svn:mime-type = application/octet-stream |
Property changes: |
Added: svn:executable |
Added: svn:mime-type |
+application/octet-stream |
\ No newline at end of property |
/Designs/Oscilloscope/SW/firmware/scope.hex |
---|
0,0 → 1,74 |
:1000000012C02CC02BC02AC029C028C027C026C0BF |
:1000100025C024C023C069C021C020C01FC01EC08D |
:100020001DC01CC01BC011241FBECFE5D4E0DEBF25 |
:10003000CDBF10E0A0E6B0E0E2E8F4E002C0059039 |
:100040000D92A036B107D9F711E0A0E6B0E001C0EB |
:100050001D92A832B107E1F76FD011C2D1CF0F9333 |
:100060001F93CF93DF93C0E6D0E008E211E08881D0 |
:1000700077D0898175D02296C017D107C1F7DF915B |
:10008000CF911F910F910895DF92EF92FF920F93FE |
:100090001F93CF93DF93C0E6D0E00F2EF8E2EF2E50 |
:1000A000F1E0FF2EF02D08E310E00F2EF5E1DF2E3A |
:1000B000F02DF8018081846080838D2D8A95F1F781 |
:1000C00080818B7F808380E075D1888380E072D1CE |
:1000D00089832296CE15DF0561F7DF91CF911F91BD |
:1000E0000F91FF90EF90DF9008951F920F920FB63F |
:1000F0000F9211242F933F934F935F936F937F93AE |
:100100008F939F93AF93BF93EF93FF938CB18D36F3 |
:1001100011F4BADFA4DFFF91EF91BF91AF919F91EE |
:100120008F917F916F915F914F913F912F910F90A0 |
:100130000FBE0F901F90189581E090E006D084E2EA |
:1001400087BB18BA34D17894FFCFE0E4F0E0908315 |
:1001500089B982E28BB988E98AB986E880830895F3 |
:10016000EBE2F0E0908195FFFDCF8CB90895CF933D |
:10017000DF93EC018881882329F0F2DF21968881C2 |
:100180008823D9F7DF91CF910895AF92BF92CF9294 |
:10019000DF92EF92FF920F931F93DF93CF93CDB730 |
:1001A000DEB72A970FB6F894DEBF0FBECDBF7B0136 |
:1001B0008C01611571058105910519F480E3D0DF8B |
:1001C00050C0992354F48DE2CBDF10950095F09444 |
:1001D000E094E11CF11C011D111D6E010894C11C6D |
:1001E000D11C0F2EFBE0AF2EBB24F02DAC0EBD1E9C |
:1001F000C801B7012AE030E040E050E003D1F60149 |
:1002000061936F01C801B7012AE030E040E050E09F |
:10021000F9D0E22EF32E042F152FCA14DB0441F778 |
:100220008A85882311F019E00DC019E09E012F5F27 |
:100230003F4F1150F901E10FF11D80818823C9F36F |
:10024000112361F07E010894E11CF11CF701E10F1C |
:10025000F11D8081805D84DF1150C1F78981805D4F |
:100260007FDF2A960FB6F894DEBF0FBECDBFCF91C9 |
:10027000DF911F910F91FF90EF90DF90CF90BF9093 |
:10028000AF900895EF92FF920F931F93DF93CF9358 |
:1002900000D000D00F92CDB7DEB79C01009719F4C3 |
:1002A00080E35EDF34C0FE0131968E010A5F1F4F8E |
:1002B000C9016AE070E092D08193C9016AE070E000 |
:1002C0008DD0262F372FE017F10791F78D818823E6 |
:1002D00011F014E00DC014E09E012F5F3F4F11504C |
:1002E000F901E10FF11D80818823C9F3112361F029 |
:1002F0007E010894E11CF11CF701E10FF11D8081E2 |
:10030000805D2EDF1150C1F78981805D29DF0F905C |
:100310000F900F900F900F90CF91DF911F910F9141 |
:10032000FF90EF9008950F931F93182F6AE04AD023 |
:10033000082F48D047D0892F805D12DF802F6AE0D8 |
:1003400041D0892F805D0CDF812F6AE03BD0892F5F |
:10035000805D06DF1F910F910895DF92EF92FF926B |
:100360000F931F93CF93DF93C0E0D0E010E8E82E07 |
:10037000FF24E7FCF09401E30F2EF0E3DF2EF02DD5 |
:10038000812F90E08E219F21009711F48D2D01C0C7 |
:10039000802FE6DE16952196C830D10589F7DF91CA |
:1003A000CF911F910F91FF90EF90DF9008958CE512 |
:1003B0008DB908958FB9EEE2F0E080818823ECF7E3 |
:1003C0008FB10895991B79E004C0991F961708F022 |
:1003D000961B881F7A95C9F780950895AA1BBB1BA9 |
:1003E00051E107C0AA1FBB1FA617B70710F0A61B35 |
:1003F000B70B881F991F5A95A9F780959095BC0156 |
:10040000CD01089597FB092E05260ED057FD04D087 |
:1004100014D00AD0001C38F45095409530952195A1 |
:100420003F4F4F4F5F4F0895F6F790958095709529 |
:1004300061957F4F8F4F9F4F0895A1E21A2EAA1BFF |
:10044000BB1BFD010DC0AA1FBB1FEE1FFF1FA21784 |
:10045000B307E407F50720F0A21BB30BE40BF50B81 |
:10046000661F771F881F991F1A9469F7609570950A |
:10047000809590959B01AC01BD01CF010895F89442 |
:02048000FFCFAC |
:00000001FF |
/Designs/Oscilloscope/PrjInfo.txt |
---|
0,0 → 1,14 |
[InfoShortDescription.en] |
Simple low frequency oscilloscope project. |
[InfoShortDescription.cs] |
Jednoduchý nízkofrekvenční osciloskop. |
[InfoLongDescription.en] |
The device services for analog signal conditioning, ADC sampling and raw data transfer to PC. Following processing is taken on the PC side. The project utilizes modules ATMEGA801B, USBRS232R01B and ADCmonoSPI01B. |
[InfoLongDescription.cs] |
Zařízení provede zákládní zpracování signálu analogovou cestou, navzorkuje daný počet hodnot a odešle je osobnímu počítači. Další zpracování provádí software PC. Projekt využívá modulů ATMEGA801B, USBRS232R01B a ADCmonoSPI01B. |
[End] |